于之前基础上增加功能:py启动后输入缩放比例,十秒内未输入,则初始化后重启py,方可按默认设置执行

Dependencies:   MQTT SDFileSystem WIZnet_Library mbed

Fork of Laser_SD_W5500 by YX ZHANG

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers networking.cpp Source File

networking.cpp

00001 #include "mbed.h"
00002 #include "WIZnetInterface.h"
00003 #include "MQTTSocket.h"
00004 #include "MQTTClient.h"
00005 #include "networking.h"
00006 
00007 extern Serial pc;
00008  //W5500接线 mosi,miso,sclk,cs,reset
00009 WIZnetInterface wiz(PB_5,PB_4,PB_3,PC_14,NC);
00010 //节点名称任取
00011 #define NODE_NAME "laser"
00012  //接在同一子网下的设备MAC地址必须不同
00013 uint8_t mac_addr[6]={0x50,0x51,0x50,0x00,0x00,0x01};
00014 
00015 recv_ctl_cb g_recv_cb;
00016 const char* (*g_actuators)[2];
00017 static Timer g_timer;
00018 
00019 void disable_LSE() //调用此函数将 PC_14, PC_15 用作普通I/O
00020 {
00021     RCC_OscInitTypeDef OscInitStruct;
00022     HAL_RCC_GetOscConfig(&OscInitStruct);
00023 //    pc.printf("%u %u %u %u\r\n",OscInitStruct.HSEState,OscInitStruct.LSEState,OscInitStruct.HSIState,OscInitStruct.LSIState);
00024     
00025     // Enable access to Backup domain
00026     HAL_PWR_EnableBkUpAccess();
00027     // Reset Backup domain
00028     __HAL_RCC_BACKUPRESET_FORCE();
00029     __HAL_RCC_BACKUPRESET_RELEASE();
00030     // Disable access to Backup domain
00031     HAL_PWR_DisableBkUpAccess();
00032     
00033     OscInitStruct.LSEState=RCC_LSE_OFF;
00034     HAL_RCC_OscConfig(&OscInitStruct);
00035     
00036     HAL_RCC_GetOscConfig(&OscInitStruct);
00037 //    pc.printf("%u %u %u %u\r\n",OscInitStruct.HSEState,OscInitStruct.LSEState,OscInitStruct.HSIState,OscInitStruct.LSIState);
00038 }
00039 
00040 
00041 void meta_report(MClient& client, const char* ns, const char* type, 
00042                     const char* payload = NULL, size_t payload_len = 0, 
00043                     bool retain = false, MQTT::QoS qos = MQTT::QOS1){
00044     char topic[64];
00045     sprintf(topic, "/%s/" NODE_NAME "/%s", ns, type);
00046     int ret = client.publish(topic, (void*)payload, payload_len, qos, retain);
00047     //pc.printf("client.publish()=%d\r\n",ret);
00048 }
00049 void messageArrived(MQTT::MessageData& md)
00050 {
00051     MQTT::Message &message = md.message;
00052     pc.printf("messageArrived %d,%d\r\n", md.topicName.lenstring.len, message.payloadlen);
00053 
00054 //    char buf[64];
00055 //    int value, len = sizeof(buf)-1;
00056 //    if(message.payloadlen < len)
00057 //        len = message.payloadlen;
00058 //    memcpy(buf, message.payload, len);
00059 //    buf[len] = '\0';
00060 //    sscanf(buf, "%d", &value);
00061 //    pc.printf("received %d\r\n", value);
00062 
00063     char* payload = new char[message.payloadlen+1];
00064     if(!payload)
00065         return;
00066     memcpy(payload, message.payload, message.payloadlen);
00067     payload[message.payloadlen]='\0';
00068     
00069     char* topic = new char[md.topicName.lenstring.len+1];
00070     if(!topic){
00071         delete[] payload;
00072         return;
00073     }
00074     memcpy(topic, md.topicName.lenstring.data, md.topicName.lenstring.len);
00075     topic[md.topicName.lenstring.len]='\0';
00076     
00077     char *pch = strtok (topic,"/");
00078     for (int tok=0; tok<2 && pch != NULL; tok++)
00079     {
00080 //        pc.printf ("%s\r\n",pch);
00081         pch = strtok (NULL, "/");
00082     }
00083     if(pch)
00084         g_recv_cb(pch, payload);
00085     delete[] topic;
00086     delete[] payload;
00087 }
00088 
00089 void publish_value(MClient &client, const char *topic, const char *buf)
00090 {
00091     meta_report(client, "values",topic,buf,strlen(buf),false);
00092 }
00093 
00094 void buildCapability(char *out, const char* infoList[][2])
00095 {
00096     out[0] = '\0';
00097     for (int i = 0; infoList[i][0]; ++i)
00098     {
00099         strcat(out, infoList[i][0]);
00100         strcat(out, ",");
00101         strcat(out, infoList[i][1]);
00102         strcat(out, "\\n");
00103     }
00104 }
00105  
00106 int networking_init(MQTTSocket &sock, MClient &client, const char *broker,const char* sensors[][2], const char* actuators[][2], recv_ctl_cb cb) {
00107     int ret;
00108     g_timer.start();
00109     disable_LSE(); //free LSE pins
00110     wiz.init(mac_addr);
00111     pc.printf("DHCP...\r\n");
00112     wiz.connect();
00113     pc.printf("IP: %s\r\n", wiz.getIPAddress());
00114     
00115     srand(rand()^g_timer.read_us());
00116     
00117     ret = sock.connect((char*)broker,1883);
00118     if(ret != 0){
00119         pc.printf("failed to connect to TCP server\r\n");
00120         return 1;
00121     }
00122     pc.printf("sock.connect()=%d\r\n",ret);
00123     
00124     srand(rand()^g_timer.read_us());
00125     
00126     ret = client.connect();
00127     if(ret != 0){
00128         pc.printf("MQTT connect failed\r\n");
00129         return 1;
00130     }
00131     pc.printf("client.connect()=%d\r\n",ret);
00132     
00133     
00134     ret = client.subscribe("/control/" NODE_NAME "/+", MQTT::QOS1, messageArrived);    
00135     pc.printf("sock.subscribe()=%d\r\n", ret);
00136 
00137     g_recv_cb = cb;
00138     g_actuators = actuators;
00139 
00140     char * capabilities = new char[128];
00141     if(!capabilities){
00142         pc.printf("failed to alloc memory\r\n");
00143         return 1;
00144     }
00145     //for (int i = 0; actuators[i][0]; ++i){
00146 //        sprintf(capabilities,"/control/" NODE_NAME "/+",actuators[i][0]);
00147 //        ret = client.subscribe(capabilities, MQTT::QOS1, messageArrived);    
00148 //        pc.printf("sock.subscribe(%s)=%d\r\n", capabilities, ret);
00149 //    }
00150 
00151     //节点上线消息
00152     meta_report(client, "events","online");
00153     
00154     //报告所有可接受的控制指令
00155     buildCapability(capabilities, actuators);
00156     meta_report(client, "capability","control", capabilities, strlen(capabilities), true);
00157     //报告所有的传感器
00158     buildCapability(capabilities, sensors);
00159     meta_report(client, "capability","values", capabilities, strlen(capabilities), true);
00160     delete[] capabilities;
00161 
00162     pc.printf("Initialization done.\r\n");
00163     
00164     return 0;
00165 }