• [技术干货] 0x04 LiteOS_Lab仓库组件详解--AT(中)
    摘要:本贴以前面3篇帖子作为基础(由下至上Uart.c、driver.c),讲解AT框架,这三层之间由下到上是一个依次调用关系,如果对前面的内容不熟悉,请回头看一看(可以通过汇总帖中的链接查看),再来看本贴,你就会更加明白和清晰了。本系列汇总贴:https://bbs.huaweicloud.com/forum/thread-51806-1-1.html下图红框中的位置是本帖所讲解内容在整个系统中AT框架的位置AT.c文件中用到的结构体typedef struct {     const char             *devname;  //we use the device frame work to do this    要使用名称为"devname"的设备作为at收发使用     los_dev_t               devhandle;//the device handle used               devname的设备句柄,可以通过该句柄对设备进行操作     at_cmd_item             cmd;      //the at command,only one command could be excuted     at_oob_item             oob[CONFIG_AT_OOBTABLEN];    //storage the out of band dealer     char                 rcvbuf[CONFIG_AT_RECVMAXLEN];  //used storage one frame,read from the at channel 用于缓存收到的数据,大小可以手动调整     unsigned int            rxdebugmode:2;          //receive debug mode     unsigned int            txdebugmode:2;          //send debug mode       int                     streammode; }at_cb_t;    //这里的cb=control block 控制块的意思AT框架初始化/******************************************************************************* function     :this is the  at module initialize function parameters   :func_read:which will read a frame from the device               func_write:which will be used to write a frame to the device instruction  :if you want to use the at frame work, please call this function                please supply the function read and write.the read function must be               a block function controlled by timeout *******************************************************************************/ /* 该函数用于初始化AT框架,在使用AT框架之前需要先调用该函数 */ int at_init() {     int ret = -1;     (void) memset(&g_at_cb,0,sizeof(g_at_cb));    //清空g_at_cb全局结构体变量中的数据     g_at_cb.devname = CONFIG_AT_DEVNAME;          //将我们配置用于AT框架设备的名称复制给devname,可以通过Kconfig配置,也可以手动配置     if(false == osal_semp_create(&g_at_cb.cmd.cmdsync,1,1))    //创建一个信号量,用于同步     {         LINK_LOG_DEBUG("%s:cmdsync error\n\r",__FUNCTION__);         goto EXIT_CMDSYNC;     }     if(false == osal_semp_create(&g_at_cb.cmd.respsync,1,0))    //创建一个信号量,用于同步     {         LINK_LOG_DEBUG("%s:cmdsync error\n\r",__FUNCTION__);         goto EXIT_RESPSYNC;     }     if(false == osal_mutex_create(&g_at_cb.cmd.cmdlock))        //创建一个互斥锁     {         LINK_LOG_DEBUG("%s:cmdlock error\n\r",__FUNCTION__);         goto EXIT_CMDLOCK;     }     if(NULL == osal_task_create("at_rcv",__rcv_task_entry,NULL,0x800,NULL,10))    //创建一个任务,用于接收AT数据     {         LINK_LOG_DEBUG("%s:rcvtask create error\n\r",__FUNCTION__);         goto EXIT_RCVTASK;     }     //for the debug     g_at_cb.rxdebugmode = en_at_debug_ascii;        //这两个模式暂时可以忽略,它们是用于通过shell来调试at设备使用的     g_at_cb.txdebugmode = en_at_debug_ascii;     ret = 0;     return ret; EXIT_RCVTASK:     (void) osal_mutex_del(&g_at_cb.cmd.cmdlock);     g_at_cb.cmd.cmdlock = cn_mutex_invalid; EXIT_CMDLOCK:     (void) osal_semp_del(&g_at_cb.cmd.respsync);     g_at_cb.cmd.respsync = cn_semp_invalid; EXIT_RESPSYNC:     (void) osal_semp_del(&g_at_cb.cmd.cmdsync);     g_at_cb.cmd.cmdsync = cn_semp_invalid; EXIT_CMDSYNC:     return ret; }使用at_oobregister注册关键词处理函数/******************************************************************************* function     :you could use this function to register a method to deal the out of band data parameters   : instruction  :as you know, we only check the frame begin,using memcmp, so you must               write the header of the frame as the index *******************************************************************************/ /*    比如说我们的nbiot模块通过udp/tcp协议连接到了服务器,服务器给nbiot模块下发一条数据,这条数据很可能是异步的,就是我们无法预测什么时候会收到该数据,       那么如何能处理这个数据呢?还好每条异步数据都会有一个前缀,例如+NSONMI:0,4,说明nbiot设备收到了一帧UDP数据,0号socket接口,长度为4字节,       我们就可以通过下面这个函数将“+NSONMI:”关键字注册进去,只要at框架发现收到了一帧以“+NSONMI:”开头的数据,就会调用我们注册的的处理函数,       来处理该数据,比如果根据+NSONMI:0,4中的4,设置4字节大小的空间,并发送AT+NSORF=0,4指令,将数据读出存储。  */  /* 传入参数name是该处理结构体的名字,index就是特定数据中会含有的关键字,比如前面说的“+NSONMI:”,len是指index的长度,func是一个函数指针,当发现index      在数据中出现,就会调用该函数指针来处理数据,args是调用该函数指针时,给函数传入的参数。   */ int at_oobregister(const char *name,const void *index,size_t len,fn_at_oob func,void *args) {     int ret = -1;     at_oob_item *oob;     int i = 0;     if((NULL == func)||(NULL == index))     {         return ret;     }     for(i =0;i<CONFIG_AT_OOBTABLEN;i++)                //在存储oob结构体的表中寻找一个空位     {         oob = &g_at_cb.oob[i];         if((oob->func == NULL)&&(oob->index == NULL))         {             oob->name = name;            //将我们传入的各项参数赋值给OOB结构体             oob->index = index;             oob->len = len;             oob->func = func;             oob->args = args;             ret = 0;             break;         }     }     return ret; }流模式使能和禁止函数/******************************************************************************* function     :you could use this function to to enable or disable at stream mode. parameters   :mode:1 for stream mode, 0 for dgram mode. instruction  :If stream mode is enabled, we can process data from multiple frames.   mode equals 0 by default. *******************************************************************************/ /* 由于UDP和TCP连接的方式有差异,所以根据我们设备选用的模式,可以选择dgram模式和stream模式,默认是dgram模式,  * 选择了不同的模式,差异主要体现在接收任务中,执行接收任务时,会判断当前采用的模式,使用不同的接收方式  */ int at_streammode_set(int mode) { g_at_cb.streammode = mode; return 0; }at框架中的内部函数,只在at框架内部使用/* 该函数被at_command函数调用,用于向uart设备写入要发送的数据 */ static int __cmd_send(const void *buf,size_t buflen,uint32_t timeout) {     int i = 0;     ssize_t ret = 0;     int debugmode;     ret = los_dev_write(g_at_cb.devhandle,0,buf,buflen,timeout);     if(ret > 0)     {         debugmode = g_at_cb.txdebugmode;         switch (debugmode)                //如果开启了debug模式,则会将发送的数据通过shell显示         {             case en_at_debug_ascii:                 LINK_LOG_DEBUG("ATSND:%d Bytes:%s\n\r",(int)ret,(char *)buf);                 break;             case en_at_debug_hex:                 LINK_LOG_DEBUG("ATSND:%d Bytes:",(int)ret);                 for(i =0;i<ret;i++)                 {                     LINK_LOG_DEBUG("%02x ",*((uint8_t *)(buf) + i));                 }                 LINK_LOG_DEBUG("\n\r");                 break;             default:                 break;         }         ret = 0;     }     else     {         ret = -1;     }     return ret; } /* 该函数在at接收任务中被调用,向driver层中读取uart设备中的数据 */ //this function used to receive data from the AT channel static int __resp_rcv(void *buf,size_t buflen,uint32_t timeout) {     int i = 0;     ssize_t ret = 0;     int debugmode;     ret = los_dev_read(g_at_cb.devhandle,0,buf,buflen,timeout); //调用driver层中的读函数,以缓存区最大字节数来读     if(ret > 0)                             //如果读到了数据     {         debugmode = g_at_cb.rxdebugmode; //假设我们使能了rxdebugmode,就会将读到的数据在串口打印         switch (debugmode)         {             case en_at_debug_ascii:                 LINK_LOG_DEBUG("ATRCV:%d Bytes:%s\n\r",(int)ret,(char *)buf);                 break;             case en_at_debug_hex:                 LINK_LOG_DEBUG("ATRCV:%d Bytes:",(int)ret);                 for(i =0;i<ret;i++)                 {                     LINK_LOG_DEBUG("%02x ",*((uint8_t *)(buf) + i));                 }                 LINK_LOG_DEBUG("\n\r");                 break;             default:                 break;         }     }         return ret; } /* 该函数在at_command函数中被调用,用于向g_at_cb.cmd结构体成员中,这个结构体中的内容最终被任务接收函数调用__cmd_match函数使用 */ static int  __cmd_create(const void *cmdbuf,size_t cmdlen,const char *index,void *respbuf,size_t respbuflen,uint32_t timeout) {     int  ret = -1;     at_cmd_item *cmd;    //定义一个命令结构体指针     cmd = &g_at_cb.cmd; //将全局at控制块结构体中的cmd结构体成员的地址赋值给cmd指针      if(osal_semp_pend(cmd->cmdsync,timeout))    //申请一个信号量,为了保持同步     {         if(osal_mutex_lock(cmd->cmdlock))    //给cmd加锁,防止多进行访问         {             cmd->cmd = cmdbuf;                //将指令内容、长度、期待的回复、接收回复的内存地址、和接收回复的内存大小都写入cmd结构体             cmd->cmdlen = cmdlen;             cmd->index = index;             cmd->respbuf = respbuf;             cmd->respbuflen = respbuflen;             (void) osal_semp_pend(cmd->respsync,0); //used to clear the sync             (void) osal_mutex_unlock(cmd->cmdlock);         }         ret = 0;     }     return ret; } /* 该函数用于清空g_at_cb.cmd结构中的内容 */ //clear the at command here static int __cmd_clear(void) {      at_cmd_item *cmd;      cmd = &g_at_cb.cmd;      if(osal_mutex_lock(cmd->cmdlock))      {         cmd->cmd = NULL;         cmd->cmdlen = 0;         cmd->index = NULL;         cmd->respbuf = NULL;         cmd->respbuflen = 0;         cmd->respdatalen = 0;         (void) osal_mutex_unlock(cmd->cmdlock);      }      (void) osal_semp_post(cmd->cmdsync);      return 0; } /* 该函数在at接收任务中被循环调用,用于检查接收到的数据是否对应我们使用__cmd_send发出去的回应,如果出现我们期待的数据(index),返回0反之返回-1 */ //check if the data received is the at command need static int  __cmd_match(const void *data,size_t len) {     int  ret = -1;     int  cpylen;     at_cmd_item *cmd = NULL;     cmd = &g_at_cb.cmd;     if(osal_mutex_lock(cmd->cmdlock))    //加锁,防止多个进程同时访问     {         if((NULL != cmd->index)&&(NULL != strstr((const char *)data,cmd->index)))    //检查index是否为空、收到的数据中是否含有我们需要的数据         {             if(NULL != cmd->respbuf)    //如果定义了respbuf缓存区并且分配了内存,就将与AT指令向对应的回复拷贝进去             {                 cpylen = len > cmd->respbuflen?cmd->respbuflen:len;                 (void) memcpy((char *)cmd->respbuf,data,cpylen);                 cmd->respdatalen = cpylen;             }             else             {                 cmd->respdatalen = len; //tell the command that how many data has been get             }             (void) osal_semp_post(cmd->respsync);             ret = 0;         }         (void) osal_mutex_unlock(cmd->cmdlock);     }     return ret; } /* 当收到一帧数据时,就会在at接收任务中调用该函数,查看这帧数据中是否有我们向oob表中注册的数据处理函数对应的关键字     如果有的话,就调用其对应处理函数来处理这帧数据 */ //check if any out of band method could deal the data static int  __oob_match(void *data,size_t len) {     int ret = -1;     at_oob_item *oob;     int i = 0;     for(i =0;i<CONFIG_AT_OOBTABLEN;i++)    //遍历存储oob结构体的数组     {         oob = &g_at_cb.oob[i];         if((oob->func != NULL)&&(oob->index != NULL)&&\             (0 == memcmp(oob->index,data,oob->len)))         {             ret = oob->func(oob->args,data,len);             break;         }     }     return ret; }由于有字数限制,后面的函数在下一节中写出,并在这里贴上链接。
  • [交流分享] NB-IOT模块(M5311)通过MQTT协议对接华为云IOT平台
    说明:最近做项目要用到M5311模块对接华为云,遇到了不少坑。最后成功了。关于这个网上资料很少,我几乎没找到很有用的资料。做的过程中就想着等做出来了写篇教程。本文目的:1、让大家避坑,节省时间。2、分享技术。        刚开始要着手解决这个问题的时候很懵。首先买了M5311模块(NB-IOT模块的一种),拿到模块相关资料之后,感觉好像没有针对我的应用的资料。然后资料中各种内容一大堆,表示看不太懂。。。后来,就有了这篇文章。技术关键词:NBIOT、M5311、MQTT协议、华为云、JSON数据格式、STM32单片机、USART通信。一、简介我要实现的功能:用STM32F1控制M5311模块通过MQTT协议(MQTT协议模块内部已经集成了,我们只需要调用相关AT指令就可以了)对接华为云平台,实现数据的上传与下发。针对我的应用的主要资料:(1) M5311的AT指令(包括MQTT有关的AT指令)(2) 华为云平台官方的开发指南二、AT流程-----------基础AT指令--------------模块开机|AT| res: OK\r\nATE0  //关闭AT指令回显,节省单片机接收缓冲区的空间| res:OK\r\nAT+CMSYSCTRL=0,2   //设置LED指示网络状态| res: OK\r\nAT+SM=LOCK_FOREVER //设置不休眠模式| res:OK\r\nAT+CLPLMN    //清除注网记录| res: +CLPLMN:空格0\r\n \r\n OK\r\nAT+CEDRXS=0,5  //关闭eDRX功能| res:  OK\r\nAT+CPSMS=2,,,"01001111","00100010" //关闭PSM功能| res: OK\r\nAT+CIMI  //确认读SIM卡正常| res:460043193208917\r\n \r\n OK \r\n  AT+CSQ   //查询信号质量| res:+CSQ:空格9,0\r\n \r\nOK\r\nAT+CEREG?  //确认基站注册状态 (第二位:1本地已注册,5**已注册)| res: +CEREG:空格0,1\r\n\r\nOK\r\nAT+CGATT?  //确认PDP激活状态(1已激活,0未激活)| res: +CGATT: 空格1\r\n\r\nOK\r\nAT+CEREG=5  //For a UE that wants to apply PSM, enable network registration| res:OK\r\nAT+CEREG?   //确认 PSM 参数是否设置成功| res: +CEREG:空格5,1,"3FE9","0CA3D416",9,"00",0,0,"00100010","11100000"\r\n\r\nOK\r\n注意:有关MQTT的AT指令的参数需要根据自己的实际情况修改。-------------MQTT协议AT指令------------------------AT+MQTTCFG="iot-mqtts.cn-north-4.myhuaweicloud.com",1883,"5eaaa3ed3766a6040511451a_123_0_0_2020043018",120,"5eaaa3ed3766a6040511451a_123","35415eb57f16397205d0056ca4269fa90fc17c4dbcbc8a8f717b48dcea70d3a3",1(说明:1、第三个参数”客户端ID“必须按照华为云平台要求的格式,即:设备ID+下划线+0或1+下划线+0或1+下划线+时间戳 (具体参考平台官方文档中:”文档首页 > 设备接入 IoTDA > API参考> 设备侧MQTT接口参考> 设备连接鉴权“有关内容 )           2、第四个参数”用户名“即华为云平台中的设备ID          3、第五个参数”密码“的值为使用“HMACSHA256”算法以时间戳为密钥,对平台密钥(创建设备时你自己设置的)进行加密后的值。)| res:OK\r\nAT+MQTTOPEN=1,1,0,0,0,"","" //发送连接建立请求| res:OK\r\n\r\n+MQTTOPEN:空格OK\r\n//注意:从这里往下的内容就有老版本和新版本之分了,我下边的示例都是用的新版本V5版本的topic(topic即主题),若需要老版本V3版本的topic可以去开发文档里找。新老版本的主要区别之一就是平台默认的topic不同。AT+MQTTSUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/commands/#",0 //订阅平台命令下发topic|AT+MQTTSUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/set/#",0 //订阅平台设置属性主题(订阅这个topic的目的是,你在平台上修改设备影子的期望值后,设备能够收到平台下发的期望值)----------------------------------设备上报属性:AT+MQTTPUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/report",0,1,0,116,7B227365727669636573223A5B7B22736572766963655F6964223A227331222C2270726F70657274696573223A7B224461746131223A2253544D333220636F6E74726F6C204D3533313120636F6E6E65637420746F2048554157454920636C6F756420544553542042592048575121227D7D5D7D平台命令下发响应:AT+MQTTPUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/commands/response/request_id={request_id}",0,1,0,18,7B22726573756C745F636F6465223A20307D平台设置属性响应:AT+MQTTPUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/set/response/request_id={request_id}",0,1,0,18,7B22726573756C745F636F6465223A20307D-----------平台下发的数据(示例)-----------------//平台下发命令+MQTTPUBLISH: 0,0,0,0,$oc/devices/5eaaa3ed3766a6040511451a_123/sys/commands/request_id=9343402b-7cb0-490c-805d-c2c93ad28c85,68,{"paras":{"parm1":"VV"},"service_id":"s1","command_name":"command1"}//平台修改设备属性+MQTTPUBLISH: 0,0,0,0,$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/set/request_id=2ba841f9-dbeb-4bab-9d04-6e8a89183f07,159,{"services":[{"properties":{"Data1":"11111111112222222223333333"},"service_id":"s1"}]}三、注意事项华为云部分:1、MQTT协议的端口有两个,1883是针对MQTT协议的,8883是针对MQTTS协议的。(我用的MQTT端口1883)2、华为物联网平台上的MQTT接口有新老版本之分,老版本是V3版本,新版本是V5版本。(由于开发文档东西有点多,我在看开发文档的时候,没有意识到这个问题,后来才发现的)平台的开发文档中说的是新老版本的接口不同,但我的感觉应该就是两个版本默认定义的topic不同。新版本topic比较多,功能也比老版本多。具体参见官方的开发文档。(这里我之说设备侧的开发,应用侧的开发我没研究)3、平台有关IOT的开发文档我觉的有点乱,大类有两个,一个是“设备接入 IoTDA”的开发文档,另一个是“设备管理 IoTDM”的开发文档。刚开始我都不知道还有两个文档。貌似”设备接入 IoTDA”的开发文档是针对新版本V5的,而另一个是针对老版本的V3的,只是说貌似。(这么说的依据是这个目录“ 文档首页 > 设备接入 IoTDA > API参考> 设备侧MQTT接口参考> Topic定义 ”和这个目录“ 文档首页 > 设备管理 IoTDM > API参考> 设备侧MQTT接口参考> 使用前必读 ”中定义的topic不同 。具体我也不清楚,自己看吧)4、平台上下行数据方式有JSON数据格式和二进制码流之分。(但是我在创建产品的时候数据传输方式只有JSON一个选项) 如果上报的格式是JSON则不用自己开发插件,如果是用二进制码流的格式则需要自己开发插件来解析数据。老版本的topic有个参数能选择上报数据时的方式,但是新版本的topic好像不能选择(我没看到怎么选择),默认的是JSON格式。5、关于JSON数据格式可以自己网上找一下资料。并不难。6、不按照JSON格式上报的数据平台不会显示(当然不包括采用老版本的二进制码流格式),只能在平台的消息跟踪里边看到相关的提示。M5311模块部分:1、模块AT指令的参数中不能含有逗号。而华为云要用的JSON格式中必须要有逗号。所以要用16进制的形式发送。具体内容见手册中的AT+MQTTPUB指令的说明。M5311模块对接平台部分:1、建议先通过电脑的串口调试助手连接并控制M5311模块(用USB转串口模块或者单片机开发板自带的USB转串口模块),对接成功之后再去编程实现功能。2、平台连接在发送完 “AT+MQTTOPEN=1,1,0,0,0,"","" ”之后如果连接成功会返回 “+MQTTOPEN: OK”。(注意,只返回“OK”的话不代表连接成功,必须是“+MQTTOPEN: OK)3、设备断开连接之后,以前订阅的主题全都没了,需要重新订阅主题。4、设备标识码可以不用模块的IMEI号(虽然有些地方说让设置为NB模块的IMEI号),自己随便设置即可。5、设备必须订阅命令下发的主题之后才能在平台上发送命令(没有提前订阅topic就下发命令,会平台提示发送失败)6、开发文档中给出的默认topic中,需要自己配置的参数用大括号括起来了,但是改这个参数的时候大括号要去掉,例如:平台给出的默认topic形式“$oc/devices/{device_id}/sys/commands/response/request_id={request_id} ”,你自己改的时候要改成这样“$oc/devices/123/sys/commands/response/request_id=456 ”(123,456只是示例,具体根据实际情况改)7、设备的影子有个期望值,平台上说的是修改期望值之后,如果正常连接,平台会下发期望值到设备。但是我用老版本的接口订阅了命令下发的默认topic,然后修改影子的期望值NBIOT模块并没有收到下发的数据,后来我改用新版本的接口,订阅了平台设置属性的topic,修改设备影子中的期望值,设备端收到了数据。(所以可能老版本的接口不支持修改设备影子中的期望值后,平台下发期望值的操作。新版本的能支持)8、(1)设备不在线,更改设备影子期望值,等设备上线,并且订阅了平台设置属性topic后,平台并不会下发之前修改的设备影子期望值。     (2)设备没有提前订阅平台设置属性topic时,等更改完设备影子期望值后又订阅了该topic,平台并不会下发之前修改的设备影子期望值。     (3)当设备上报的属性值与影子中的期望值不一致时,平台会下发影子中的期望值。但是当设备上报一次与影子中的期望值相同后,若影子中的期望值一直保持不变,再上报与影子中不同的值,平台不会再下发影子中的期望值。        前两点与平台的开发文档中描述不太一致,不清楚是平台的bug还是我的操作有问题。(如果想等设备上线时把影子中的数据同步到设备可以考虑用“设备侧获取平台的设备影子数据”的方法,平台开发文档有详细介绍)9、平台下发数据到设备之后,设备需要返回应答,至于没有应答的后果,,,一段时间之内没有进行应答,会导致连接断开。但是我的测试有时候设备没有进行应答并不会断开连接,但有时候会断开连接,具体原因不太清楚。所以还是建议进行应答。结束语:1、如果需要STM32控制M5311模块对接华为云平台源码的可以留言或者联系Q1693794917(注明来意)2、如果遇到实在解决不了的问题可以在平台上创建工单,咨询平台工程师。3、华为云平台以及NBIOT模块功能很多也有点复杂,我并没有全面的了解、测试。所以本文的观点可能会有些片面、不当、错误之处,望各位谅解、指正。未完待续。。。。。。。。。。。。
  • [技术干货] 道LOT--史上最简单的物联网系统
    github地址为 https://github.com/Supermax197/tao-lot道LOT基于树莓派,是史上最简单的物联网系统之一。 道LOT基于springboot,自动打TCP隧道,也就是让用户可以远程点对点操作物联网设备。 道LOT通过application.properties配置文件进行配置,配置tcp隧道端口如下:upnp.externalPort=8088道LOT启动并成功打通TCP隧道后,会自动发有奖把树莓派设备的公网ip与映射端口号到到指定的邮箱,配置如下:spring.mail.host= smtp.qq.comspring.mail.port= 465spring.mail.username = xxxxxxxx@qq.comspring.mail.password = xxxxxxxxxxxxxxx道LOT利用Pi4j来控制树莓派,非常简单。可参考  http://pi4j.com/ 道LOT的Controller是个简单的例子,主要功能有查看TCP映射信息与打开关闭led灯泡。用户可以很方便的进行扩展。<br>最后附上架构图————————————————版权声明:本文为CSDN博主「Jeruen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/jeruen/article/details/80094415
  • [问题求助] 基于LiteOS的Socket TCP通信速率只能达到200ms的周期
    LiteOS创建一个TCP通信任务,每隔100ms通过 lwip_send 接口往PC 网络调试助手发送一次数据(Hello World)。实际测试发现:1、TCP通信任务能够100ms调度一次;2、但是网络传输出现阻塞现象,200ms的周期发送两帧数据;3、通过 wireshark 抓包来看,确实是200ms的周期才发送数据。请问有什么方式实现网络通信的实时传输?以下为网络调试助手接收到的数据:[2020-04-23 10:07:11.549]# RECV ASCII FROM 192.168.168.99 :52032>Hello WorldHello World[2020-04-23 10:07:11.749]# RECV ASCII FROM 192.168.168.99 :52032>Hello WorldHello World[2020-04-23 10:07:11.949]# RECV ASCII FROM 192.168.168.99 :52032>Hello WorldHello World
  • [最新动态] 【第五天】LiteOS移植---通信协议
    DAY5:通信协议1、      截图需要有华为云账号2、      需要有创建命令处理任务代码3、      需要编译成功完成时间:2020.5.31 23:59请注意:直播进行答疑,学习过程中有任何问题,请在答疑帖中提出,我们会在直播中一一答疑
  • [问题求助] 使用MQTT 协议与平台对接失败
    请问, 下面证书验证失败的问题有谁碰到过么?使用demo代码:Agentlite_LinuxC_Demo.zip环境: hisi35161970-01-01 02:40:07 SCK INF: sock(2) disc lasterr:91970-01-01 02:40:07 HTTP INF: UHttpFsm(2)[1:CONNECTING] run SCK(2) msg(2:TCP_DISC) to [CONNECTING] ok1970-01-01 02:40:07 SCK INF: sock(2) close1970-01-01 02:40:07 TLS INF: tls method use 3, old 01970-01-01 02:40:07 TLS INF: tls use same ctx.1970-01-01 02:40:07 SCK INF: sock(3) HTTP(2) mode:1 type:4 open 192.***.*.120 :364311970-01-01 02:40:07 SCK INF: sock(3) cretls ret:01970-01-01 02:40:07 SCK INF: sock(3) connecting 49.*.**.24 :8943 ret:0 errno:01970-01-01 02:40:07 HTTP INF: UHttpFsm(2)[1:CONNECTING] run TMR(0) msg(1:WAIT_RECONN) to [CONNECTING] ok1970-01-01 02:40:07 SCK INF: sock(2) delete send:0 recv:0 discard:0 scnt:0 rbuf:0 uerr:01970-01-01 02:40:07 TLS ERR: tlsssl shutdown error[1].1970-01-01 02:40:07 SCK INF: sock(2) deltls ret:01970-01-01 02:40:07 SCK INF: sock(3) 49.*.**.24 :8943 preconnect1970-01-01 02:40:07 HTTP INF: UHttpFsm(2)[1:CONNECTING] run SCK(3) msg(0:TCP_ACK) to [CONNECTING] ok1970-01-01 02:40:07 TLS ERR: tlsssl connect error[1] errno[0] e:33****686-error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed1970-01-01 02:40:07 SCK INF: sock(3) disc lasterr:9参考https://bbs.huaweicloud.com/forum/thread-35453-1-1.html, 重新下载证书,问题依旧没有解决常见问题(1)OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failedagentLite 证书校验失败,请检查证书是否配置正确,证书一般是放置在demo中的conf目录下的rootcert.pem 文件,如果该目录下已经存在证书文件,请点击下载更换证书
  • [交流吐槽] 【讨论】你的敏捷团队有工作协议吗,协同高效吗?
    讨论主题高效协同工作是有秘诀的,这个秘诀就是工作协议,或者叫统一工作方式,你怎么看?关键字敏捷、高效协同、工作方式、工作协议心得团队共同制定好工作协议或者工作方式是协同高效的秘诀。团队成员按照自己制定的方式有条不紊的工作着,那是多么幸福的一件事情。给大家展示一个以前带过团队的工作协议的例子:需要强调一点,工作协议中约束的内容是灵活变化的,也许它适合你现在的时间点,但可能不适合未来的某个时间点,需要按照环境来调整。欢迎大家交流,共同探讨和分享。
  • [热门活动] 【华为云 •战疫精英招募计划】活动规则
    活动链接:https://bbs.huaweicloud.com/forum/thread-41842-1-1.html1、 活动时间:2020年2月13日~2020年3月12日2、 参与方式:2.1 设计创新项目参与活动的用户需在华为云上环境或本地开发环境中设计创新项目。创新项目需与新冠疫情及新冠疫情周边话题相关,创新项目的内容、编程语言、涉及的技术领域等均不做限制。禁止参与活动的用户以任何方式抄袭、窃取他人的项目创意和成果,一经发现则取消发布者的奖项评选资格。在创新项目征集期内,参与活动的用户需自行承担因使用华为云上资源而产生的一切费用。2.2 回复创意简介参与活动的开发者需对创新项目进行简单介绍,并将创新项目的设计思路及程序运行结果截图回复至活动帖子下。创新项目概述需按照回复格式要求进行回复,回复的内容必须包含项目概述+详细说明。项目概述要求按照项目设计背景+项目产生的价值的格式进行介绍。创新项目详细说明的内容和展现形式等均不做限制。禁止发布谣言及任何反动言论,一经发现则取消发布者的奖项评选资格,并依法追究发布者的法律责任。2.3 参与创意评选本次活动结束后,将由华为云专家从创新项目的创意、设计思路、可落地性、项目成本等多个维度进行评判。优秀的创新项目所有者,将获得优秀创意奖,奖品为华为云定制双肩包一个和获奖电子证书;特别优秀的创新项目所有者,将获得杰出创意奖,创新项目将被推荐至华为云沃土计划,并将获得项目扶持资金、免费的云上资源和获奖电子证书。项目所有者需同意并遵守沃土计划的相关要求。3、 奖品发放说明:每位参与活动的用户理解并同意,为联系获奖用户以及奖品发放的需要,用户须在参与活动之时提供诸如姓名、联系方式、电子邮箱、通讯地址等真实个人信息,活动主办方将仅为前述目的以及适用法律限度内收集和使用用户的个人信息(用户在向华为云提交个人信息之前,应阅读、了解华为云《隐私政策声明》;用户参与本活动视为理解并同意华为云《隐私政策声明》,华为云《隐私政策声明》网页地址如下:https://www.huaweicloud.com/declaration/sa_prp.html)。获奖用户在领奖界面填写获奖信息,活动结束且用户填写完整领奖信息后14个工作日内,将统一发出奖品,奖品发出后,所收集的个人信息将会被尽快删除。所有实物奖品包邮,不额外收取任何费用。由于获奖用户自身原因(包括但不限于提供的联系方式有误、身份不符或者通知领奖后超过30天未领取等)造成奖品无法发送的,视为获奖用户放弃领奖。为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的用户收回抽奖及奖励资格。本活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。所有参与本活动的用户,均视为认可并同意遵守《华为云用户协议》,包括以援引方式纳入《华为云用户协议》的《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。云服务协议链接的网址:http://www.huaweicloud.com/declaration/sa_cua.html如果您不同意本活动规则和云服务协议的条款,请勿参与本活动。 
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第135期Bitbucket-4.10.1安装配置指南
    1、简介OpenFire是一个采用纯Java语言编写(核心架构使用Mina构建)的开源RTC(Real-Time Communications,实时协作)服务器。它采用XMPP协议进行分布式通信,该协议的前身其实就是基于Jabber协议,只不过XMPP对其进行了部分扩展。说到底XMPP协议无非就是一个基于TCP/IP协议的扩展协议,它采用XML的方式进行数据传输,以此满足体系结构的中立。类别:通信工具 2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.14软件包bitbucket 4.10.1https://downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-4.10.1-x64.bin3、依赖安装yum –y install git perlJDK 1.8安装:参考:https://bbs.huaweicloud.com/forum/thread-21264-1-1.htmlMySQL 5.6安装:参考:https://bbs.huaweicloud.com/forum/thread-21283-1-1.html4、组件安装首先需要登录MySQL,创建bitbucket库mysql –uroot –pCREATE DATABASE bitbucket CHARACTER SET utf8 COLLATE utf8_bin;GRANT ALL ON bitbucket.* TO 'bitbucket'@'%' IDENTIFIED BY 'bitbucket';GRANT ALL PRIVILEGES ON bitbucket.* TO 'bitbucket'@'localhost' IDENTIFIED BY 'bitbucket';FLUSH PRIVILEGES;QUIT数据库设置完成后就开始下载bitbucketcd /usr/local/srcwget https://downloads.atlassian.com/software/stash/downloads/atlassian-bitbucket-4.10.1-x64.binchmod +x atlassian-bitbucket-4.10.1-x64.bin./atlassian-bitbucket-4.10.1-x64.bin在安装中的交互(默认服务http端口为7990,服务端口为8006,安装时可以根据自己需要重新输入):        出现最后一步即表示已经安装并启动成功。5、系统配置  无6、测试可以通过http://localhost:7990访问        7、参考信息无8、FAQ无
  • [公告] 华为起诉美运营商专利侵权索赔10亿美元
    面对不为所动的 Verizon,华为终于出手了。 一、华为起诉美国第一大运营商 Verizon雷锋网消息,2 月 6 日,华为在深圳宣布,已经在美国德克萨斯州东区和西区法院提起了对美国第一大通信运营商 Verizon 的专利侵权诉讼。 在这起诉讼中,华为认为 Verizon 侵犯了自身的 12 项专利;这 12 项专利并不涉及到 5G,而是涉及到计算机网络、下载安全和流媒体传输等多个领域的技术。华为方面表示,自 2019 年 2 月以来,华为已经与 Verizon 进行了多次磋商,而且华为也向 Verizon 提供了一系列的专利证明和相关证据,但是这两家公司却没有达成共识。华为在一份声明中表示: 自 2015 年以来,华为已收到超过 14 亿美元的专利许可费。迄今为止,华为还为合法使用行业同行开发的专利技术支付了 60 亿美元。这些许可费中的 80% 已经交给了美国的公司。 与此同时,华为首席法务官宋柳平也表示:Verizon 的产品和服务受益于华为多年研发的专利技术。多年来,我们已经与许多公司成功地谈判了专利许可协议。不幸的是,当协议没能达成的时候,我们别无选择,只能寻求法律补救。值得一提的是,在这次诉讼中,华为方面没有要求提供特定金额的赔偿,因为它需要更多的信息来得出准确的估计,但可能需要数亿美元。二、双方并不是第一次交手在这起诉讼正式提起之前,华为此前曾经就专利问题与 Verizon 进行过沟通。其中在 2019 年 6 月,根据《华尔街日报》披露的一封信,华为曾经在 2019 年 3 月 29 日指责 Verizon 侵犯了该公司的 238 项专利组合,并在信中告诉 Verizon“ 相信贵公司会从我们的专利组合授权中获得益处”。《华尔街日报》还表示,双方还在 2019 年 6 月在纽约就专利授权问题进行了多轮的邮件对话和电话会议——不过,从当时的情况来看,显然这并得出没有什么结果。需要说明的是,Verizon 并没有直接购买华为的产品,但是却依赖超过 20 个使用了华为底层技术的供应商。根据一名知情人士的说法,华为当时所提出的相关专利诉求涵盖了多个领域,包括网络设备和无线技术。这名知情人士表示,华为的诉求金额将超过 10 亿美元。值得一提的是,针对上述报道中的那封信,Verizon 的一位发言人 Richard Young 拒绝发表正面评论,但他还是就此事对媒体补充称:这件事不仅仅牵涉到 Verizon。考虑到更广泛的地缘政治背景,任何涉及华为的问题都会对我们整个行业产生影响,也会引起国内外的关注。 言语中,颇为不以为意。当然,专利问题并不是华为与 Verizon 之间的全部纠葛。2018 年 1 月,华为在举行与美国拉斯维加斯的 CES 2018 上发布了 Mate 10 Pro 手机,并且宣布了在美国推出这款手机的消息;然而,在合作渠道上,余承东却承认,美国运营商 AT&T 迫于某种压力临时终止了与华为的合作。雷锋网注意到,在 AT&T 终止合作后不久,Verizon 也迫于某种压力终止了销售华为手机的计划。三、这次的专利诉讼,华为会赢吗? 作为全球最大的通信设备供应商,以及中国最强大的科技公司之一,华为手中的专利为它在全球业务的发展提供了屏障。2019 年 1 月,面对外媒关于 ” 西方对包括华为在内的中国企业最常见的指责就是盗窃知识产权“ 的提问,华为创始人任正非表示: 华为在美国经历了几场大官司,都获得良好的结果。华为现在 87805 项专利中,其中有 11152 项核心专利是在美国授权的,我们的技术专利对美国的信息社会是有价值的。我们已经和很多西方公司达成了专利交叉许可。华为不能代表别的企业,但是我们自己是绝对尊重他人知识产权的。 另外,在 2019 年 6 月,任正非在与《福布斯》著名撰稿人 George Gilder 和美国《连线》杂志专栏作家 Nicholas Negroponte 的对话中,就知识产权问题表示:华为的知识产权不会武器化,但是相互之间的交互许可是必要的,世界上很多公司每年给华为付很多专利费,因为有保密协议,我们不能公开,也有很多企业华为没有去要钱,是因为太忙了,闲下来的时间去要一些,但是不一定像高通这么多。 现在来看,华为对 Verizon 的起诉,其实已经在任正非的话语中得到了预言。值得一提的是,针对华为的起诉,Verizon 方面也给出了回应,回应称:华为的突然起诉是偷袭,也是想占领公关制高点。他们的目标不是 Verizon,而可能是任何一个对它不屑一顾的国家或者企业。这一行为缺乏价值,Verizon 将不遗余力捍卫自己的权利。一番言语之中,Verizon 的态度可见一斑。就目前的情况来看,华为与 Verizon 势必会对簿公堂,一场中美两大科技巨头之间的专利大战即将展开。
  • [技术干货] MQTT协议产品如何在商用环境使用
    前提条件已完成MQTT协议产品的开发。一、在开发中心导出产品的Profile文件进入开发中心,选择“产品->产品开发”,点击需要转商用的MQTT产品。在该产品开发空间,点击“Profile定义”,然后点击“导出Profile”,导出MQTT产品。本地保存路径自定义。二、在设备管理导入产品的Profile文件进入设备管理服务,在“我的应用”选择需要导入Profile文件的应用,然后点击左下角第一个按钮,进入该应用。选择“产品模型”,鼠标移至右上角的“新增产品模型”,点击“本地导入”。在“手动导入产品”页面,填写产品名称,上传上文导出的Profile文件,然后点击“确定”,完成产品的导入。至此,产品可以在设备管理使用,在产品模型列表,点击“详情”,可以查看产品详情。三、在设备管理注册设备验证产品的能力选择“设备->设备注册”,在“单个注册”页面,点击“创建”。在“单设备注册”页面,填写设备相关信息,产品模型选择上文导入的产品,然后点击“确定”,完成设备注册。使设备上电,并上报一条数据,然后在“设备->所有设备”,点击刚注册的设备,进入“设备详情->设备信息”,查看“最近上报数据”,验证数据是否正确。
  • [公告] 华为与天津渤化集团签署全面深化合作协议
    为进一步加快转型升级,学习借鉴先进发展经验,12月17日,渤海化工集团有限责任公司(以下简称渤化集团)党委书记、董事长王俊明一行参访华为深圳总部以及松山湖南方工厂,并与华为签署全面深化合作协议,渤化集团党委书记、董事长王俊明,渤化集团副总经理张宝春,渤化资产管理有限责任公司党委书记、董事长杨翊军,华为企业BG智慧园区业务部总裁苏宝华,华为智慧园区交付总经理王作鹏,华为天津企业业务总经理江文淼等参加签约仪式。渤海化工集团有限责任公司与华为签署全面深化合作协议  根据协议,双方将充分发挥各自优势,利用自身的核心竞争力,在数字化转型、企业管理、信息化建设、智慧化工园区等多方面展开深度合作,谋发展,求创新,共同推动渤化集团传统产业智能化改造,加快转型升级,并为各类客户提供优质的解决方案和服务。  此前,渤化集团下属渤海物联科技股份有限公司和华为已成立智慧化工联合创新实验室,开展智慧化工园区方面的合作。此次全面深化合作协议的签署,将推动双方合作关系再上新台阶,开展更深、更广、更有力的合作。 
  • [交流吐槽] 使用 MQTT 协议与平台对接可能出现的问题
    使用 MQTT 协议与平台对接可能出现的问题其实只需要简单理解mqtt的消息订阅发布机制,就能用mqtt的方式和平台对接常见问题(1)OpenSSL Error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failedagentLite 证书校验失败,请检查证书是否配置正确,证书一般是放置在demo中的conf目录下的rootcert.pem 文件,如果该目录下已经存在证书文件,请点击下载更换证书(2)我现在使用移远的EC20模块连接贵平台,通过使用MQTT3.1.1协议,那我该以什么方式向贵平台发送证书参考:https://github.com/LiteOS/LiteOS/blob/develop/demos/agenttiny_mqtt/agent_tiny_demo.c(3)请问mqtt可以不使用证书连接平台吗?不可以,平台目前只支持MQTTS接入,原生接口参考:https://support.huaweicloud.com/api-IoT/iot_06_3002.html(4)移远BC2模块使用MQTT协议连接NB-iot平台后,如何使用MQTT的消息订阅和发布功能,以及查看发出的数据订阅设备上报数据的topic(https://support.huaweicloud.com/api-IoT/iot_06_3010.html),往平台发送数据订阅设备接收命令的topic(https://support.huaweicloud.com/api-IoT/iot_06_3011.html),接收平台下发给设备的数据(5)请问,设备接入那块,支持mqtt接入,我用java写了一个mqtt客户端去连接设备接入给我分配的地址和端口,一直连不上这个mqtt服务器,请问是不支持这种做法接入设备吗?还是只能通过设备本身烧写代码接入设备自己写的客户端是可以连接到平台的,一直连不上得看下具体的报错Java 代码示例参考:https://bbs.huaweicloud.com/forum/thread-27358-1-1.html(6)mqtt直连订阅主题,下发命令接收不到,调用设备服务调用接口失败设备想要收到下发的命令,必须订阅设备接收命令的topic(https://support.huaweicloud.com/api-IoT/iot_06_3011.html)调用接口失败,请参考接口返回的错误码和错误描述解决问题(7)物联网平台能支持物联网设备使用MQTT协议接入吗,我看使用MQTT.fx接入时要是用证书,能不用证书的接入吗?参考问题(3)(8)教程文档里存在mqtt接入华为云的方式,但是现在我公司的使用的模组不支持mqtts,只支持mqtt,请问如何使用mqtt接入华为云模组作为客户端连接华为云mqtt服务器,是否是mqtts的连接应该是服务端所决定,参考问题(3)(9)ERROR MqttBase: MqttBase_onConnectFailure() error, messageId 0, code -1, message TCP/TLS connect failure参考问题(1)(10)我用mqtt推送消息到华为云平台消息收到了,但是她没有向我设备的回调接口发送数据问题理解,我用mqtt协议发送数据到平台,然后我设置了回调,数据到达平台的时候应该进入到我设置的回调,告诉我数据发送出去了。最终的问题是,使用mqtt.fx模拟器发送数据,然后订阅推送数据到应用服务器(就是问题所描述的回调)。原因:订阅了设备信息变化(deviceInfoChanged),数据一直收不到,得订阅 设备数据变化(deviceDataChanged)(11)设备通过MQTT连接平台成功后,订阅主题 /huawei/v1/devices/c9c645c9-56a2-4d2b-a299-40d4aeb2e537/command/json,但是平台给该设备发送命令,设备没有收到消息,可能是什么原因?可以直接调接口 设备服务调用(https://support.huaweicloud.com/api-IoT/iot_06_0052.html) 给mqtt设备下发命令就能收到命令了(12)使用paho mqtt模拟设备上报数据,代码如下:xxx  最终报证书错误。请问改如何在Python中设置证书?Python示例:https://bbs.huaweicloud.com/forum/thread-27362-1-1.html(13)我已经用MQTT.fx模拟接入了Iot平台,并实现了数据上报到平台。请问怎样能从平台上下发数据给MQTT.fx?我订阅了/huawei/v1/devices/{deviceId}/command/json这个topic,但不知道怎样从平台把数据下发到设备端,谢谢!参考问题(11)(14)使用MQTT方式连接物联网平台,必须加载ca证书才能连接上华为云,但是我看平台支持MQTT(S),不知道是怎么才能MQTT连接(不用加载CA证书)必须得加证书,参考 https://support.huaweicloud.com/api-IoT/iot_06_3009.html(15)原生MQTT接口连接,控制台总是报无效客户机标识经排查代码,发现心跳时间要设置30s以上,即options.setKeepAliveInterval(30);这个值 改为30以上(16)1、通过原生MQTT协议接入平台,能否提供不带证书的方案?像阿里云,onnet云都有不带证书的模式连接。2、是否支持多主题订阅发送。目前都是需要带证书的上报数据的主题就一个(17)使用模拟器快速体验(MQTT设备),按照文档指示:应用对接IP地址,填写从设备接入服务从管理控制台 获取的应用对接IP地址。但进入管理控制台,并未看到对应的IP,我尝试使用ping 对应的域名获取IP,填入依然连接失败。设备连接应该使用 设备对接信息中的IP,且是8943和8843对应的IP地址(18)设备管理服务采用MQTT协议接入,消息格数为二进制码流 模拟设备调试可以成功 问真实设备怎么调试,是否支持二进制码流mqtt一般来说上去的数据都是json,推荐直接以json的形式上报;如果报二进制的话topic中的codecMode要变成 binary,上报的消息要转成binary上报可以参考java demo 示例未完持续更新。。。有关于 MQTT 的问题欢迎补充!!!
  • [公告] 华为携手绿城,共创未来智慧生活
    8月25日,华为与绿城中国签署战略合作协议暨咨询合同。绿城中国董事会主席、总裁张亚东与华为公司轮值董事长郭平出席仪式并见证了协议签署。本次签约以“建设智慧园区,连接美好生活”为主题。根据协议,双方将在现有5个智慧园区项目的基础上,进一步加深实质性合作。华为基于大数据、5G、人工智能等新ICT技术,依托可运营的智慧园区数字平台,使能绿城探索房地产运营模式转型,实现并复制智慧生活场景,服务美好生活。华为轮值董事长郭平表示:有颜值的绿城和有技术的华为从相识相知到相伴,离不开双方团队所付出的辛勤劳动,本次战略合作协议,对于华为和绿城双方,都将是一个新的里程碑,一个新的起点。未来,华为和绿城将会进行更加深入的合作,在更多的层面和更多的领域,共同打造面向未来的生活服务。绿城中国董事会主席、总裁张亚东表示:绿城与华为都在各自领域引领行业和产品创新的方向。本次合作,双方基于各自的核心竞争力,秉持‘优势互补、资源共享、创新共建’的原则,在战略发展、数字化转型、企业大学、智慧园区及智能家居等领域开展全方位、深层次、多元化的战略合作。今天协议的签署是新的号角、新的启动,希望绿城和华为双方团队能把合作成果在实际项目中切实落地,加强在双方集团各个领域的全方位相互学习和交流。自2018年以来,绿城中国与华为在多个业务领域开展了合作,此次签署战略合作协议,必将推动双方战略合作关系迈向新阶段。未来,双方强强联合,以科技赋能住宅,推进智慧园区项目落地,共创未来智慧生活。华为全联接大会HUAWEI CONNECT 2019将于9月18-20日在上海举办,华为智慧园区将展示以数字平台为核心的园区整体解决方案,并举办专场智慧园区峰会和生态论坛,通过与业界思想领袖、客户及生态伙伴的实践分享,共同探索智慧园区创新之路,共谋产业发展之道。原文请参考:https://mp.weixin.qq.com/s/CVOurqWiturRltJjylg5OQ
  • [问题求助] agent lite sdk 的“设备绑定”网关下的非直连设备协议只适用Z-WAVE的协议吗?zigbee能否?