应用程序实现目的

客户端通过广播发送信息,模组端的应用程序获取广播信息,解析信息修改相应的配置文件

功能需求

1. 烧写mac地址、设备序列号

烧写完固件后,模组默认ip为192.168.0.200,默认mac地址为"A8:C3:15:00:00:00",默认device_id为"JS00000000000000"。需要修改mac地址、设备序列号后模组才能使用。

mac地址、device_id不支持批量修改。

Request Body:

{"magic_value": "AABB5555",    # 幻数"msg_type": "client",         # "client":搜索软件请求消息,"board":板卡回复消息"msg_cmd": "set_mac_id",      # 修改mac地址# 参数"mac": "A8:C3:15:00:00:15","device_id": "JS01229110000900"
}

Response Body:

{"magic_value": "AABB5555","msg_type": "board","msg_cmd": "set_mac_id",# 返回结果"result": "ok"               # "ok":修改成功 "fail":修改失败
}

mac地址、device_id分别存储于/mnt/data/cfg/eth_cfg.cfg、/mnt/data/cfg/device_id。

2.修改ip地址

客户端通过设备搜索接口获取到所有在线模组的mac地址后,即可通过mac修改相关模组ip。

模组收到消息后解析,mac与板卡mac地址相同时才进行ip设置,不同时忽略该消息。

Request Body:

{"magic_value": "AABB5555",    # 幻数"msg_type": "client",         # "client":搜索软件请求消息,"board":板卡回复消息"msg_cmd": "set_ip",          # 修改ip# 参数    "mac": "A8:C3:15:00:00:15",   # 待修改模组的mac地址"ip": "192.168.0.11"          # 待修改模组的ip
}

Response Body:

{"magic_value": "AABB5555","msg_type": "board","msg_cmd": "set_ip",# 返回结果"result": "ok"                # "ok":设置成功
}

功能实现

Manager.h头文件-定义私有类成员函数

class CDevManager
{class CDevManager
{public:CDevManager();~CDevManager();int Start();int Stop();int SetCameraHdl(void *hdl);static int NotifyPtpCfg(PTP_CFG &cfg);static int NotifyNtpCfg(NTP_CFG &cfg);static int NotifySyslogCfg(SYSLOG_CFG &cfg);static void RebootEnable();//重启板卡static void NotifyUpdateBegin();static void NotifyUpdateDone();static void ResetSensorEnable();//重新配置sensorstatic int GetSensorStatus();//获取sensor重启状态private:void DevSearchThrFunc();//设备搜索线程void DevManageThrFunc();//设备管理线程:重启、NTP、重配sensorvoid DevBurnMAC_IP_Func(); //burn MAC、devID、IPvoid broadcast_dev_info();void MAC_dev_info(const char *m,const char *d);void SetIP_dev_info(const char *IP);protected:thread*     m_pDevSearchThr;thread*     m_pDevManageThr;thread*     m_pImgProcThread;thread*      m_pDevBurnmacThr;thread*     m_PDevSetIPThr;};

Manager.cpp函数主体

添加头文件、函数声明

#include <iostream>#include<fstream>int SaveEthMacCfg(EthCfg *eth_cfg);
int deviceId(string *device_id);

DevBurnMAC_IP_Func()函数主题

void CDevManager::DevBurnMAC_IP_Func()
{int sock_serv;int res;struct sockaddr_in servaddr;struct sockaddr_in cliaddr;socklen_t clilen;int recv; int enable = 1;int maxFd = 0;fd_set fds;struct timeval TimeoutVal;char data[BROADCAST_BUF_SIZE];json_t *json_body;json_t *value = nullptr;const char *magic_value = nullptr;const char *msg_type = nullptr;const char *mac_value = nullptr;const char *device_id = nullptr;const char *msg_ip = nullptr;const char *msg_cmd = nullptr;sock_serv = socket(AF_INET,SOCK_DGRAM,0);if(sock_serv < 0) {perror("socket()");}EthCfg eth_cfg = CConfigParser::GetInstance()->GetEthCfg();setsockopt(sock_serv, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(BROADCAST_REQUEST_PORT);servaddr.sin_addr.s_addr = INADDR_ANY;res = bind(sock_serv,(struct sockaddr *)&servaddr,sizeof(servaddr));if(res < 0) {perror("bind()");}while(1){if (!m_nRunning) {CTimeUtils::msSleep(5000);continue;}FD_ZERO(&fds);FD_SET(sock_serv, &fds);if(maxFd<=sock_serv)maxFd = sock_serv;TimeoutVal.tv_sec  = 2;TimeoutVal.tv_usec = 0;res = select(maxFd + 1, &fds, NULL, NULL, &TimeoutVal);switch (res){case -1: break;case 0:    break;default:if(FD_ISSET(sock_serv, &fds)){clilen = sizeof(cliaddr);memset(&data, 0, BROADCAST_BUF_SIZE);recv = recvfrom(sock_serv, &data, BROADCAST_BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &clilen);if(recv <= 0)continue;json_body = json_loads(data, 0, NULL);if(json_is_object(json_body)) {value = json_object_get(json_body, "msg_cmd");if(json_is_string(value)) {msg_cmd = json_string_value(value);}value = json_object_get(json_body, "magic_value");if(json_is_string(value)) {magic_value = json_string_value(value);}value = json_object_get(json_body, "msg_type");if(json_is_string(value)) {msg_type = json_string_value(value);}value = json_object_get(json_body, "mac");if(json_is_string(value)) {mac_value = json_string_value(value);}value = json_object_get(json_body, "device_id");if(json_is_string(value)) {device_id = json_string_value(value);}value = json_object_get(json_body,"ip");if(json_is_string(value)){msg_ip = json_string_value(value); }}printf("msg_cmd:%s,magic_value:%s,msg_type:%s,mac:%s,device_id:%s,IP:%s,eth_cfg.mac:%s\n",msg_cmd,magic_value,msg_type,mac_value,device_id,msg_ip,eth_cfg.Mac);if(0==strcmp(magic_value, BROADCAST_REQUEST_MAGIC) && 0==strcmp(msg_type,"client")) {if(0==strcmp(msg_cmd, "set_mac_id")){printf("begin into burnMac\n");MAC_dev_info(mac_value,device_id);printf("finish burnMac\n");}else if(0==strcmp(msg_cmd, "set_ip") && 0==strcmp(mac_value,eth_cfg.Mac)){printf("begin SetIP\n");SetIP_dev_info(msg_ip);printf("finish SetIP\n");}}json_decref(json_body);}break;}}close(sock_serv);}

MAC_dev_info回调函数

void CDevManager::MAC_dev_info(const char *m, const char *d)
{string device_id;const char *mac_value;mac_value = m;device_id = d;EthCfg eth_cfg = CConfigParser::GetInstance()->GetEthCfg();strcpy(eth_cfg.Mac,mac_value);SaveEthMacCfg(&eth_cfg);printf("hello MAC_dev_info\n");deviceId(&device_id);
}

保存MAC地址SaveEthMacCfg函数实现

int SaveEthMacCfg(EthCfg *eth_cfg)
{json_t *object;object = json_object();json_object_set_new(object, "ip", json_string(eth_cfg->IP));json_object_set_new(object, "gateway", json_string(eth_cfg->gateway));json_object_set_new(object, "submask", json_string(eth_cfg->submask));json_object_set_new(object, "dns1", json_string(eth_cfg->dns1));json_object_set_new(object, "dns2", json_string(eth_cfg->dns2));json_object_set_new(object, "mac", json_string(eth_cfg->Mac));string MAC_CFG = gOptions.GetJsonCfgPath() + ETH_CFG_FILE_PATH;printf("SaveMAC:%s,path:%s\n",eth_cfg->Mac,MAC_CFG.c_str());json_dump_file(object, MAC_CFG.c_str(), JSON_PRESERVE_ORDER);json_decref(object);return 0;
}

修改设备Id功能deviceId函数实现

int deviceId(string *device_id)
{using namespace std;string devId;devId = *device_id;printf("devId:%s\n",devId.c_str());ofstream ofs;ofs.open("/mnt/data/cfg/device_id", ios::out);ofs << devId << endl;ofs.close();return 0;
}

修改IP功能SetIP_dev_info函数实现

void CDevManager::SetIP_dev_info(const char *IP)
{int ret=0;EthCfg eth_cfg = CConfigParser::GetInstance()->GetEthCfg();printf("getIP is:%s\n",IP);strcpy(eth_cfg.IP,IP);ret = CConfigParser::GetInstance()->SetEthCfg(eth_cfg);printf("hello SetIP:%s\n",eth_cfg.IP);//使用固定参数#if 0 strcpy(eth_cfg.IP,"192.168.12.215");ret = CConfigParser::GetInstance()->SetEthCfg(eth_cfg);printf("hello SetIP:%s\n",eth_cfg.IP);#endif
}

客户端应用程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <string.h>#include "jansson.h"#define BROADCAST_REQUEST_PORT   20555
#define BROADCAST_REQUEST_MAGIC 0xAABB5555
#define BROADCAST_RESP_PORT     21555
#define BROADCAST_RESP_MAGIC    0xBBAA5555//设备信息
typedef struct tagDEVICE_INFO
{char  device_id[32]; char  device_name[32];//可修改char  soft_version[32];
}DEVICE_INFO;//网络设置
typedef struct tagETH_CFG
{char  ip[16]; char  gateway[16];//可修改char  submask[16];char  dns1[16];char  dns2[16];char  mac[18];
}ETH_CFG;//自动发现设备通信协议
typedef struct tagDEV_SEARCH_REQUEST
{unsigned int magic_value;unsigned int msg_type;//0-搜索软件发出 1-板卡回复消息
}DEV_SEARCH_REQUEST;int main(void)
{int sock_cli;struct sockaddr_in cliaddr;int res;int recv;socklen_t clilen;int enable = 1;sock_cli = socket(AF_INET,SOCK_DGRAM,0);if(sock_cli < 0){perror("socket()");return -1;}//允许发送广播数据setsockopt(sock_cli,SOL_SOCKET,SO_BROADCAST,&enable,sizeof(enable));cliaddr.sin_family = AF_INET;cliaddr.sin_port = htons(BROADCAST_REQUEST_PORT);inet_pton(AF_INET, "255.255.255.255", &cliaddr.sin_addr);json_t *objectmsg;char *result;objectmsg = json_object();json_object_set_new (objectmsg, "msg_cmd", json_string("set_mac_id"));json_object_set_new (objectmsg, "magic_value", json_string("AABB5555"));json_object_set_new (objectmsg, "msg_type", json_string("client"));json_object_set_new (objectmsg, "mac", json_string("A1:C1:10:00:00:10"));json_object_set_new (objectmsg, "device_id", json_string("JS01229110000666"));//json_object_set_new (objectmsg, "ip", json_string("192.168.12.214"));result = json_dumps(objectmsg, JSON_PRESERVE_ORDER);printf("result=%s %ld\n",result, strlen(result));{res = sendto(sock_cli, result, strlen(result), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));if(res < 0){perror("sendto()");return -1;}}close(sock_cli);return 0;
}

C++应程序实现修改设备IP地址、MAC、设备ID功能相关推荐

  1. 用pe修改计算机ip地址,实现WinPE上网功能修改IP及DNS方法

    要实现WinPE上网功能,除了给PE添加网卡驱动外,我们还需要设置WinPE的IP和DNS配置脚本,如何才能实现这一功能呢?下面小编就来教大家设置的方法. 代码如下: echo 正在设置IP即DNS的 ...

  2. 华为手机怎么修改dns服务器,手机修改域名服务器ip地址吗

    手机修改域名服务器ip地址吗 内容精选 换一换 安装依赖时,使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络,且提示"Could not find a vers ...

  3. 图漾相机-如何修改相机IP地址

    文章目录: 一.官方命令介绍 二.连接相机并枚举到相机 三.修改IP为静态,Windows10为例 1.相机默认是自动ip. 若新修改的静态 IP 地址与计算机的 IP 地址不在同一网段,先修改计算机 ...

  4. 手机修改域名服务器,手机修改域名服务器ip地址

    手机修改域名服务器ip地址 内容精选 换一换 安装依赖时,使用pip3.7.5 install xxx命令安装相关软件时提示无法连接网络,且提示"Could not find a versi ...

  5. svn设置 修改服务器,svn设置 修改服务器ip地址

    svn设置 修改服务器ip地址 内容精选 换一换 介绍单机场景和集群场景配置Ansible主机信息. 日志记录了系统的运行情况和功能流程的处理情况,是维护人员查看系统状态.进行问题定位的重要工具和手段 ...

  6. 【Linux】MAC名称修改、IP地址和MAC地址绑定

    在虚拟机多网卡的环境中,有时IP会随着网卡的重新启动变得不一致,这时,就需要将IP地址和MAC进行绑定,有时也需要对网卡名称进行修改,本篇将对此进行演示. 一 软件环境 VMware® Worksta ...

  7. 华硕/网件R7000梅林固件修改LAN IP地址无法进/登入后台的解决方法

    梅林修改LAN IP地址:由192.168.1.1(默认地址)修改为192.168.50.1后,192.168.50.1无法进入后台界面,这里的前提是,你的网络还是可以正常联网!基本就是网页服务器挂了 ...

  8. linux如何修改ip文件夹,求助!Linux下C++程序如何修改系统IP?

    求助!Linux下C++程序如何修改系统IP? 发布时间:2014-11-19 19:00:55来源:红联作者:firespout 项目是用C++做的,需要修改系统IP,本以为这种很通用的功能已经有成 ...

  9. 改服务器的ip地址如何修改密码,ip地址服务器怎么修改密码

    ip地址服务器怎么修改密码 内容精选 换一换 本节操作介绍如何在移动设备上连接Linux实例.以iTerminal-SSH Telnet为例介绍如何在iOS设备上连接 Linux 实例,详细操作请参考 ...

  10. php设置公网ip,修改公网IP和mac地址的建议方法分享

    最近本人需要用php写一个模拟程序,该程序需要不断变化公网IP地址,以及修改本机的mac地址. 经过一段时间的研究,我发现了解决之道.在这里将此方法和大家分享,我希望此方法在某时某地能. 对读者有所助 ...

最新文章

  1. AI如何落地企业?UCloud三步走战略:Build,Train,Deploy
  2. 独家 | 一文读懂如何用深度学习实现网络安全
  3. mysql java datetime_Java向mysql数据库插入datetime类型数据实例(精)
  4. 计算机应用基础浙大,2014春浙大远程教育计算机应用基础-3.Word知识题
  5. python turtle画熊-Python turtle画图库画姓名实例
  6. 深入出不来nodejs源码-编译启动
  7. 在学术论文投稿时你遇到过最奇葩的审稿意见是什么?
  8. 使用run-rs启动mongodb
  9. 黄文俊:Serverless小程序后端技术分享
  10. Sgen.exe: Speed up XmlSerializer's Startup Performance [.NET 2.0, XML Serialization]
  11. libevent源码深度剖析四
  12. 用winformz时间格式不正确_煮八爪鱼,有人用冷水,有人用开水,大厨:都不对,教你正确做法...
  13. js 格式化输出_JS之 调试
  14. JS红宝书学习记录(一)
  15. Elasticsearch 如何实现相似推荐功能?
  16. 文本标注开源系统Doccano、Label Studio、BRAT比较
  17. QQ远程协助,不能远程操作对方WIN7 旗舰版 电脑的系统组件
  18. 线性回归中的最小二乘法和梯度下降法比较
  19. BFT-SMaRt:用Netty做客户端的可靠信道
  20. 【字符串】Hash表

热门文章

  1. 记一次mysql调优
  2. maltose-Transferrin 麦芽糖-转铁蛋白
  3. oracle execute immediate 单引号嵌套,Oracle EXECUTE IMMEDIATE语句里面的引号处理
  4. 读书笔记 - 9 lies abouts work
  5. 搭档之家:华为手机“秒售罄”炒上6万! 小米等多家折叠屏布局明年
  6. solr获取同义词 java_solr中文同义词问题,求教
  7. Swift学习笔记|swift基本语法
  8. 怎么在ChemDraw Prime 15中实现分子三维旋转
  9. 关于 管理工具---服务。
  10. Excel文件中核对两个工作表中不同内容