首页 文章 精选 留言 我的

精选列表

搜索[智能体开发],共10000篇文章
优秀的个人博客,低调大师

智能体安全迈入全链路治理新阶段|悬镜 4 款产品入选数说安全《2026 网络安全十大创新方向》,问境 AIST 作为智能体运行安全代表方案落地政企

近日,国内权威媒体数说安全正式发布《2026 网络安全十大创新方向》报告。报告结合国内政企 AI 业务落地实践,研判网络安全前沿技术演进趋势,覆盖 AI 原生安全、安全运营、密码安全等多个领域,可为各行业安全团队开展技术选型、规划安全体系提供重要产业参考。

优秀的个人博客,低调大师

【Android开发—智能家居系列】(四):UDP通信发送指令

思路回顾 【1】手机连接WIFI模块 【2】UDP通信对WIFI模块发送指令,以和WIFI模块保持连接状态 【3】UDP通信对WIFI模块发送指令,让其搜索可用的无线网,返回WIFI列表 【4】发送指令,让WIFI模块接入指定路由 【5】手机连接路由 【6】发送指令,获得WIFI模块的动态IP地址 UDP通信线程类 package com.jczb.smartlife.common; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketException; import java.net.UnknownHostException; import android.os.Handler; import android.os.Message; import com.jczb.smartlife.common.Tool; public class GetInfoThread extends Thread { private Handler handler; private DatagramSocket socket; private int msgType; private final String IP = "255.255.255.255";//广播地址 private int PORT = 26000; /** * 48899端口:C32x系列的端口,用户可以用AT指令更改 * 49000端口:除C32x系列,其他WIFI模块的端口 * 1902端口:有人掌控宝系列产品的端口 */ private int targetPort = 49000 ; private boolean receive = true; /** * * @param handler 传入监听此线程的Handler * @param intMsg 传入监听的消息类型 */ public GetInfoThread(Handler handler,int msgType) { this.handler = handler; this.msgType=msgType; init(); } public void init(){ try { socket = new DatagramSocket(null); socket.setBroadcast(true); socket.setReuseAddress(true); socket.bind(new InetSocketAddress(PORT)); } catch (SocketException e) { e.printStackTrace(); sendErrorMsg("Search Thread init fail"); return; } } public void run() { if (socket == null) { return; } try { byte[] data = new byte[1024]; //创建一个空的DatagramPacket对象 DatagramPacket revPacket = new DatagramPacket(data, data.length); while (receive) { //服务端接收数据 socket.receive(revPacket); if(null!=handler){ byte[] realData = new byte[revPacket.getLength()]; System.arraycopy(data, 0, realData,0, realData.length); Message msg =handler.obtainMessage(msgType,realData); handler.sendMessage(msg); } } } catch (Exception e) { e.printStackTrace(); socket.close(); } } public void close() { if (socket == null) return; socket.close(); } private void sendErrorMsg(String info){ } /** * 发送数据 * @param msg */ public void sendMsg(byte[] msg) { if (socket != null) { try { System.out.println("targetPort------------------->"+targetPort); DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(IP), targetPort); socket.send(sendPacket); } catch (UnknownHostException e) { e.printStackTrace(); System.out.println("发送失败"); } catch (IOException e) { e.printStackTrace(); System.out.println("发送失败"); } } } public void setReceive(boolean receive) { this.receive = receive; } public void setTargetPort(int targetPort) { this.targetPort = targetPort; } public void setMsgType(int msgType){ this.msgType=msgType; } } 发送消息的线程类 /** * 发送消息的队列,每次发送数据时,只需要调用putMsg(byte[] data)方法 * * @author usr_liujinqi * */ private class SendMsgThread extends Thread { // 发送消息的队列 private Queue<byte[]> sendMsgQuene = new LinkedList<byte[]>(); // 是否发送消息 private boolean send = true; private GetInfoThread ss; public SendMsgThread(GetInfoThread ss) { this.ss = ss; } public synchronized void putMsg(byte[] msg) { // 唤醒线程 if (sendMsgQuene.size() == 0) notify(); sendMsgQuene.offer(msg); } public void run() { synchronized (this) { while (send) { // 当队列里的消息发送完毕后,线程等待 while (sendMsgQuene.size() > 0) { byte[] msg = sendMsgQuene.poll(); if (ss != null) ss.sendMsg(msg); } try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void setSend(boolean send) { this.send = send; } } 应用 【举例】发送搜索WIFI模块的指令 //1.用户获得温控器中WIFI模块的WIFI模块的IP地址,MAC地址,模块名称的指令 private final byte[] getInfoCode=new byte[]{(byte)0x48,0x46,0x2D,0x41,0x31,0x31,0x41,0x53,0x53,0x49,0x53,0x54,0x48,0x52,0x45,0x41,0x44}; public static final int REC_Module=0x04;//搜索WIFI模块的信息(包括IP、Mac、名称) //实例化一个线程,用户获得模块信息(IP,Mac,名称) //参数为监听为此线程的Handler,以及接收成功后,给Handler发送的消息类型 getInfoThread = new GetInfoThread(handler,Tool.REC_Module); getInfoThread.start(); //发送消息的线程 smt = new SendMsgThread(getInfoThread); smt.start(); //设置发送的目的端口号 getInfoThread.setTargetPort(Integer.parseInt("48899")); smt.putMsg(getInfoCode); WIFI模块在接收到指令后,就会回复信息,以下的Handler就是针对回复过来的信息进行解析处理等操作。 //处理消息的Handler private Handler handler= new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case Tool.REC_Module:// 解析接收到的数据 //设置发送的目的端口号 getInfoThread.setTargetPort(Integer.parseInt("48899")); getInfoThread.setMsgType(Tool.REC_OK); smt.putMsg(okCode); SetServer(); SetDHCP(); byte[] data = (byte[]) msg.obj; //将十进制的数据转化成十六进制数据 String strTemp= Tool.bytesToHexString(data); //将十六进制的字符串去掉空格之后进行解析 String strdecode=Tool.DecodeHex(strTemp.replace(" ", "")); //取出IP,Mac地址,模块名称 decodeIP(strdecode); Toast.makeText(ConnectWifiActivity.this, "获得WIFI模块名称成功!"+ModuleName, Toast.LENGTH_SHORT).show(); break; case Tool.REC_Server: byte[] dataServer = (byte[])msg.obj; //将十进制的数据转化成十六进制数据 String strServer= Tool.bytesToHexString(dataServer); if("2b 6f 6b 0d 0a 0d 0a ".equals(strServer)){ Toast.makeText(ConnectWifiActivity.this, "设置服务器成功!", Toast.LENGTH_SHORT).show(); } break; case Tool.REC_SSID: byte[] dataSSID=(byte[])msg.obj; Tool.bytesToHexString(dataSSID); decodeData(dataSSID); break; case Tool.REC_AT: byte[] dataID = (byte[]) msg.obj; //将十进制的数据转化成十六进制数据 String strTempID= Tool.bytesToHexString(dataID); //将十六进制的字符串去掉空格之后进行解析 String strdecodeID=Tool.DecodeHex(strTempID.replace(" ", "")); break; case Tool.REC_DHCP: byte[] dataDHCP = (byte[])msg.obj; //将十进制的数据转化成十六进制数据 String strDHCP= Tool.bytesToHexString(dataDHCP); if("2b 6f 6b 0d 0a 0d 0a ".equals(strDHCP)){ Toast.makeText(ConnectWifiActivity.this, "设置DHCP网络参数成功!", Toast.LENGTH_SHORT).show(); } break; default: byte[] data1 = (byte[]) msg.obj; //将十进制的数据转化成十六进制数据 String strTemp1= Tool.bytesToHexString(data1); Toast.makeText(ConnectWifiActivity.this, strTemp1, Toast.LENGTH_SHORT).show(); break; } } }; 总结 凡是需要对WIFI模块发送指令的,就需要用到上述的两个线程类,还有一个对返回信息进行处理的Handler。只是发送的指令的code不一样,如上述表示的是搜索WIFI模块的十六进制的指令。不管WIFI模块在AP模式下还是STA模式,通信的最开始步骤都是先搜索模块,然后获得它的IP和Mac之后,立即回复+ok指令,就可以保持连接状态。 本文转自 一点点征服 博客园博客,原文链接: http://www.cnblogs.com/ldq2016/p/6774195.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

【Android开发—智能家居系列】(三):手机连接WIFI模块

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载。网上这些类似的工具类里的代码差不多是一样的。连接无线网主要有两个方法: 其中有一个Connect方法,还有一个connectSpecificAP方法,对于不需要密码就能链接的WIFI模块,我使用的是后者。 主要步骤 连接WIFI大致分为一下几个步骤: 【1】打开WIFI openWifi 【2】配置网络信息 createWifiInfo返回WIFiConfig 【3】添加配置好的网络并连接 int netID = mWifiManager.addNetwork(wifiConfig); boolean bRet = mWifiManager.enableNetwork(netID, false); 【4】判断连接是否成功 上面的enableNetWork方法返回成功并不能反映手机是否真的连接成功,所以还需要调用isConnect方法进行判断,针对自己的业务逻辑和场景,我又写了一个判断是否连接成功的方法:isWifiConnected的方法 应用 /** * 手机接入模块的WIFI网络——BLACKANTS */ private void ConnectDisplay(){ //获得消息对象 Message msg=mainHandler.obtainMessage(); //是否连接成功的一个标记 Boolean isConnected=false; //标志BLACKANTS的ScanResult是否存在,true存在,false不存在 Boolean isExist=false; //用户存放BLACKANTS的WIFI信息 ScanResult srWifiInfo=null; //声明一个用于临时存放SSID的变量 String strTempSSID; /******************以下一段代码主要是为了获得BLACKANTS的ScanResult(包括了它的SSID,BSSID,capabilities)*****************/ //扫描WIFI wifiAdmin.startScan(); //获得WIFI列表 List<ScanResult> lstWiFi= wifiAdmin.getWifiList(); //如果WIFI列表为空,则说明WIFI开关未打开,向Handler发送消息 if(lstWiFi==null || lstWiFi.size()==0){ msg.what=NotOpen; mainHandler.sendMessage(msg); return; } //如果列表存在,则对列表进行遍历 if(lstWiFi!=null & lstWiFi.size()>0){ //遍历列表,查看BLACKANTS是否存在 for(int i=0;i<lstWiFi.size();i++){ strTempSSID=lstWiFi.get(i).SSID; //如果存在,则退出For循环 if((DisplaySSID).equals(strTempSSID.trim()) ){ //修改标志位为存在 isExist=true; //将BLACKANTS的Wifi信息放入到变量srWifiInfo中 srWifiInfo=lstWiFi.get(i); break; } } } /******************以上一段代码主要是为了获得BLACKANTS的ScanResult(包括了它的SSID,BSSID,capabilities)*****************/ //默认是失败 msg.what=Failure; //如果存在,则让手机接入BLACKANTS-------------------V1.0 if(isExist){ if(wifiAdmin.connectSpecificAP(srWifiInfo)){ //判断是否连接上 if(wifiAdmin.isWifiConnected(InitActivity.this,DisplaySSID)){ msg.what=Success; } } } mainHandler.sendMessage(msg); } 附: 下载工具类(WIFIAdmin) 本文转自 一点点征服 博客园博客,原文链接: http://www.cnblogs.com/ldq2016/p/6774176.html ,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册