精华内容
下载资源
问答
  • 硬件交互之命令交互

    千次阅读 2018-03-20 14:05:42
    转载自:http://blog.csdn.net/Suma_sun/article/details/51388816...数据包协议(数据收发协议)命令协议(命令交互)类型转换为什么需要数据包协议呢,如果没有对应的协议,你们将无法沟通成功,牛头不对马嘴的在交互...

    转载自:http://blog.csdn.net/Suma_sun/article/details/51388816

    在智能家居公司混了这么久,都没怎么发些有营养的东西,最近感觉不能再这么懒下去了。准备写几篇有关的文章,就当记录下免得忘记了,也方便其他人少走弯路。

    • 数据包协议(数据收发协议)
    • 命令协议(命令交互)
    • 类型转换

    为什么需要数据包协议呢,如果没有对应的协议,你们将无法沟通成功,牛头不对马嘴的在交互,都完全不知道对方说的是什么。 
    首先硬件嵌入式多是用c/c++开发的所以想要与之交互需要使用它所能读懂的数据结构——结构体。 
    c/c++和java不同数据类型是不同的,所以通讯的时候要使用通用的数据类型——字节流(byte[])。PS:java、c/c++数据类型各占几个字节就请自行百度吧。

    数据包协议 
    搞清楚了交互的数据类型,就该弄清楚接收到的数据的内容,因为都是以字节来表示,所以你需要知道某个属性或者说是描述的字节长度,否者强行转型也都是乱码(字符串)或错误的值。接下来就来定义一个结构体作为协议的内容。

    	typedef struct { 
    		int cmd;//命令标识码 
    		SMsgContent content;//实际内容
    	}SMsg

    结构体已经给出了,也都有注释不难看出其中意义。cmd是交互命令的唯一标识码,就像Handler的what一样,用于选择对应的解析与操作。

    下面给出是cmd的写法

    
    public static final int IOCONTROL_GET_ALL_PARAMS_REQ = 0x03D8;
    
    public static final int IOCONTROL_GET_ALL_PARAMS_RESP = 0x03D9;

    命令协议 
    命令协议就是写在数据包协议里的content的。用作cmd对应的交互用数据,比如该设备是个音响,给其设置声音,那么可能就有音量、低音炮、音频之类的值,把这些命令拆开成几个包分开发送就会增加代码量与交互次数,相应的耗电就提高,业务处理也麻烦。

    typedef struct{
    int version;
    unsigned int reserved[3];
    }SMsgGetAllParamsReq

    version为了让大家了解写法而加上去的一个参数,也可以用作请求api的版本号,reserved[3]保留位置,用于方便以后添加新参数可用

    typedef struct {
     int id;//设备id
     char device_name[32];//设备名称
     char soft_ver[32];//软件版本号
     char firm_ver[32];//硬件版本号
     unsigned int reserved[3];
    }SMsgGetAllParamsResp

    接下来就是关键代码了,将命令转换为byte[]用于命令交互

    public class SMsgGetAllParamsReq{
        public static byte[] gen(int version){
            byte[] data = new byte[16];
        System.arraycopy(Packet.intToByteArray_Little(version, 0), 0,
                        arrayOfByte, 0, 4);
            return data;
            }
        }

    首先为什么要这样实现呢? 
    估计大家都有疑问为什么要设置数组长度为16呢?那是因为int类型占4个字节(java、c/c++一样),byte类型占一个字节(1字节 = 8位,1024字节 = 1KB)。 
    System.arraycopy这个系统函数是用于拷贝数组在内指定容到另一个数组的指定位置。Packet稍后会给大家做介绍。

    public class SMsgGetAllParamsResp{
        public static final COUNT = 3;
        public int id;
        public String device_name;
        public String soft_ver;
        public String firm_ver;
        public int[] reserved = new int[COUNT];
    
        public static SMsgGetAllParamsResp parse(byte[] data){
            SMsgGetAllParamsResp  resp = new SMsgGetAllParamsResp ();
            resp.id = Packet.byteArrayToInt_Little(data,0);
            resp.device_name = new String(data, 4, 32).trim();
            resp.soft_ver = new String(data, 36, 32).trim();
            resp.firm_ver= new String(data, 68, 32).trim();
            int index = 100;
            for(int i=0;i<COUNT;i++){
                resp.reserved[0] = Packet.byteArrayToInt_Little(data,index);
                index += 4;
                }
            return resp;
            }
    
        }

    new String(bytes, offset, length)这个函数相信大家都很熟悉我就不介绍了,里面的值也就是偏移量也是一眼就明了的。

    到目前为止命令的解析生成就介绍完毕了。

    类型转换 
    数据类型转换不必说大家想必也是很清楚的,最简单的(int)100L,Long类型强转int类型,文中为什么不使用呢?因为效率的原因,直接使用位运算符操作效率会高很多。

    public static final int byteArrayToInt_Little(byte byt[], int nBeginPos) {
            return (0xff & byt[nBeginPos]) | (0xff & byt[nBeginPos + 1]) << 8 | (0xff & byt[nBeginPos + 2]) << 16 | (0xff & byt[nBeginPos + 3]) << 24;
        }
    
    public static final byte[] intToByteArray_Little(int value) {
            return new byte[] { (byte) value, (byte) (value >>> 8), (byte) (value >>> 16), (byte) (value >>> 24) };
        }

    至于其他类型的转换请各位自行百度吧,相信你们可以找到,要善用搜索引擎。

    捣鼓了几个晚上终于写完了,虽然因为公司要加班晚上写文章的时间很少,虽然时间长也算是写完了。楼主笔风粗俗还望各位海涵,有任何有问题、错误的地方请随时留言。

    下一篇准备结合nio写命令的发送接收,把今天的内容整合到一块。

    补充内容

    类型转换还有些小坑的地方补充下。 
    一个请求的结构体

    typedef struct {
     char type;// 设置类型那个
     int  operate;//操作类型 0:打开 1:关闭
     unsigned int reserved[3];
    }

    type占一个字节,operate应该从索引1开始4的长度。正常来说是这样没错, 
    但是c/c+是会补位的,也就是说虽然type只占一个字节,但是为了后面的operate(4字节)存放,会直接补位补三位0,当时和同事调接口的时候死活传错参数,后面才知道他读取operate是从4开始的而不是从1开始。

    所以遇到类似情况请先和设备端同事沟通,或者看看协议规范。

    java后台的同事问我这样传有什么优点,之前还真没仔细考虑过。 
    目前总结几点,也请各大神帮我补充

    1. 字节流传输跨平台,兼容性好,效率高(底层都是转为字节流传输的)
    2. 使用结构体,方便嵌入式直接转换为指针对象,就像java的序列化一样,减少了嵌入式代码量(嵌入式一般受硬件条件约束,空间有限,尽量缩减代码)

    展开全文
  • expect命令交互命令

    2016-11-18 18:30:08
    Shell脚本学习之expect命令 http://blog.csdn.net/leexide/article/details/17485451
    展开全文
  • nslookup命令交互式使用 本文转自快网(www.cnkuai.cn) , 原地址:http://www.cnkuai.cn/news/257.htm

    nslookup命令交互式使用

    本文转自快网(www.cnkuai.cn) , 原地址:http://www.cnkuai.cn/news/257.htm

    1、首先,点击“开始”==》运行,输入nslookup(如下图);
     
     
     

     
     
     
     
    2、输入nslookup,然后回车,进入nslookup交互式界面(如下图);
     
     
     
     
     
    3、查询域名A记录,输入:set type=a,回车,进入A记录查询模块,然输入您要查询的域名,回车后,即可查询到该域名的A记录解析详情(如下图);
     
     
     
     
     
     
     
    4、查询域名MX记录(邮件记录,邮局指向),输入:set type=mx,回车,进入MX记录查询模块,然输入您要查询的域名,回车后,即可查询到该域名的MX记录解析详情(如下图);
     
     
     
     
     
     
     
    5、查询域名CNAME记录(别名指向),输入:set type=cname,回车,进入Cname记录查询模块,然输入您要查询的域名,回车后,即可查询到该域名的Cname记录解析详情(如下图);
     
     
     
     
     
     
    6、查询域名ns记录(域名所使用的DNS),输入:set type=ns,回车,进入DNS记录查询模块,然输入您要查询的域名,回车后,即可查询到该域名的DNS记录解析详情(如下图);
     
     
     
     
     
    关于nslookup的详细说明,请看:Nslookup命令详解

    本文转自快网(www.cnkuai.cn) , 原地址:http://www.cnkuai.cn/news/257.htm

    展开全文
  • scrapy命令交互模式介绍 scrapy 命令交互模式启动 $ scrapy shell 网址[不需要引号] 命令交互模式中函数介绍 request 对网址发起请求的请求信息 response网址服务器响应请求,发回的响应信息 view(response)...

    scrapy命令交互模式介绍

    scrapy 命令交互模式启动

    $ scrapy shell 网址[不需要引号]

    命令交互模式中函数介绍

    request 对网址发起请求的请求信息

    response网址服务器响应请求,发回的响应信息

    view(response)调用系统自带浏览器,查看response中保存着从网址中获取的网页数据

    fetch(url)在交互模式下,重新对一个url网址发送请求,自动更新到request和response中

    scrapy项目爬虫文件说明

    init.py -> 保持默认,不需要做任何修改

    items.py-> 自定义项目类的地方,也就是爬虫获取到数据之后,传入管道文件(pipelinies.py)的载体

    pipelinies.py->项目管道文件,对传入的项目类中的数据进行一个清理和入库

    settings.py->Scrapy项目的设置文件,例如下载延迟,项目管道文件中类的启用以及自定义中间件的启用和顺序

    spiders目录-》里面只有一个init.py文件,在该目录下定义爬虫类并继承scrapy.Spider

    middlewares.py ->中间件配置文件

    Scrapy爬虫文件ganji.py介绍

    name="zufang" 爬虫名字,如果项目中有多个爬虫,名字别重复

    start_urls = ['http://....'] 爬虫启动后自动爬取的链接,列表内可以放多个链接

    def parse(self,response):爬虫启动时,爬取链接成功后自动回调的函数,默认parese,参数self和response也是必须得

    response.xpath("").extract():固定格式,如果xpath("")里面不放任何字符串会报错,如果里面的字符串是/结尾,则代码会报错

     

     

    展开全文
  • COMMAND_T cmd_led = { .command = "led", .function = func_led, .next = &cmd_beep }; void func_led(void) { char tab[12]; unsigned char i = 0; char *p = buffer; while((*p !...&...
  • python和linux命令交互有两种方式: 1. 直接使用os执行命令 os.system("armory -leg %s"%(host)) 这种方式的问题在于命令直接输出到console中了,无法定制。   2.使用pexpect import pexpect ...
  • 本文实例讲述了python文件读写操作与linux shell变量命令交互执行的方法。分享给大家供大家参考。具体如下:python对文件的读写还是挺方便的,与linux shell的交互变量需要转换一下才能用,这比较头疼。代码如下:#...
  • 有很多网络设备我们拿到了root权限后ssh登陆发现有命令执行限制,这是因为ssh接口提供了一个特殊的受限制的命令外壳程序,类似busybox的感觉,他可以允许root用户对设备进行配置处理,但是不允许进行命令交互,所以...
  • linux 运行 proxyCommand 命令 需要交互输入两次密码 ;跳板机密码和目标服务器密码。 解决: 最终要解决的是:跳板机与目标服务器之间 无密码跳转 解决方案: 1、 做公钥认证,不使用秘钥认认证,太麻烦。 需要...
  • 0. 写在前面  Version Redis2.2.2  Redis中可以支持主从结构,本文主要从master和slave的心跳机制出发(PING),分析redis的命令行交互。  在Redis中,server为...其中,redisClient为命令交互设置了缓冲区。query
  • bat文件交互命令While a multitude of methods exist to search for and replace words in a single file, what do you do when you’ve got a string to update across multiple unrelated files, all with ...
  • hive变量调用 hive和shell hdfs命令交互调用 hiverc预定义初始化       1 hive使用外部变量: 分为4种情况,   hive中引用外部变量: 在代码中引用时使用${...}; 方式1: [root@h2single bin...
  • # 执行错误命令就返回乱码 r = os.popen('ipconfig') # read读取执行结果 print(r.read()) subprocess.Popen() import subprocess r = subprocess.Popen('dir', shell=True, stdout=subprocess.PIPE, stde...
  • linux命令交互页面如何快速复制粘贴

    千次阅读 2019-02-23 10:16:33
    shift + ctrl + c 复制 shift + ctrl + v 粘贴 选中需要复制的内容,shift + ctrl + c 然后再命令行输入 shift + ctrl + v  
  • 5-AT命令交互之-APN

    千次阅读 2018-11-12 11:41:48
    即便在 PDP 启动过程中已分配地址,该命令的读出形式仍继续返回为空。使用 AT+CGPADDR 命令,可读出该分配地址 <d_comp> 关闭(若取值省略,则该参数为缺省值);数值型参数;用于控制 PDP 数据压缩 <h_comp> 关闭...
  • 而我现在需要软件直接执行我排好序的命令,以便获取硬件信息,这时需要做个远程的命令登陆,然后远程执行命令,再退出。这其实就好比要模拟telnet、ftp等的客户端,当远程登陆后执行一个指令,然后
  • 4-AT命令交互之-COPS选择营运商

    千次阅读 2018-11-09 09:21:17
    模块默认一般都可以自动搜网注册,比如移动的就注册到移动,联通的就... 1.AT+COPS命令说明 上面格式里面,stat这个值比较重要,他会直接告诉我们哪些运营商可用。 &lt;stat&gt; 0 未知 1 可用 2 当前 3 ...
  • 本文介绍URI的基本格式,并结合Hadoop 2.7.x相关HDFS命令,讲解在与HDFS交互中如何指定文件和目录确切位置的URI。
  • )从 Windows 命令提示符 (CMD) 或 PowerShell 运行 Linux 二进制文件。 从 Linux 运行 Windows 工具 如果对应的Windows 工具在环境变量中,那么在WSL输入即可直接启动Windows 工具,例如通过notepad.exe启动文本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,126
精华内容 13,650
关键字:

命令交互