实例介绍
【实例简介】
智能电子价签AP系统配置工具,让系统接入客户网络环境。
【实例截图】智能价签配置工具
【文件目录】
AP-TOOL
├── SUOTA.iml
├── app
│ ├── app.iml
│ ├── build.gradle
│ ├── crashlytics.properties
│ ├── libs
│ │ └── zxing.jar
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ ├── fonts
│ │ │ ├── MyriadPro-BoldCond.ttf
│ │ │ ├── MyriadPro-Cond.ttf
│ │ │ ├── MyriadPro-Light.otf
│ │ │ ├── MyriadPro-Regular.ttf
│ │ │ └── MyriadPro-Semibold.otf
│ │ ├── info.html
│ │ └── logo-dialog-blue.png
│ ├── ic_launcher-web.png
│ ├── java
│ │ └── com
│ │ └── dialog
│ │ └── suota
│ │ ├── RuntimePermissionChecker.java
│ │ ├── SuotaApplication.java
│ │ ├── activities
│ │ │ ├── DeviceActivity.java
│ │ │ ├── InfoActivity.java
│ │ │ ├── ScanActivity.java
│ │ │ ├── SplashActivity.java
│ │ │ └── SuotaActivity.java
│ │ ├── bluetooth
│ │ │ ├── BluetoothGattReceiver.java
│ │ │ ├── BluetoothGattSingleton.java
│ │ │ ├── BluetoothManager.java
│ │ │ ├── Callback.java
│ │ │ ├── DspsManager.java
│ │ │ ├── FactoryManager.java
│ │ │ ├── SpotaManager.java
│ │ │ └── SuotaManager.java
│ │ ├── data
│ │ │ ├── File.java
│ │ │ ├── Statics.java
│ │ │ └── Uuid.java
│ │ ├── fragments
│ │ │ ├── DisclaimerFragment.java
│ │ │ ├── FACTORYFragment.java
│ │ │ ├── InfoFragment.java
│ │ │ ├── SPOTAFragment.java
│ │ │ ├── SUOTAFragment.java
│ │ │ └── SplashFragment.java
│ │ ├── global
│ │ │ ├── BusProvider.java
│ │ │ ├── ScanAdapter.java
│ │ │ ├── ScanItem.java
│ │ │ ├── SignalBar.java
│ │ │ └── Utils.java
│ │ ├── protocol
│ │ │ ├── ByteArray.java
│ │ │ ├── Cmd.java
│ │ │ ├── Crc.java
│ │ │ ├── Packet.java
│ │ │ ├── PacketProc.java
│ │ │ ├── TypeEplCtrl.java
│ │ │ ├── WrapInterface.java
│ │ │ ├── Wraper.java
│ │ │ ├── WraperIpInfo.java
│ │ │ ├── WraperMac.java
│ │ │ ├── WraperReport.java
│ │ │ ├── WraperThreeMac.java
│ │ │ └── WraperWifi.java
│ │ └── zxing
│ │ ├── ScanListener.java
│ │ ├── camera
│ │ │ ├── AutoFocusManager.java
│ │ │ ├── CameraConfigurationManager.java
│ │ │ ├── CameraManager.java
│ │ │ ├── PreviewCallback.java
│ │ │ └── open
│ │ │ └── OpenCameraInterface.java
│ │ ├── encode
│ │ │ └── EncodingHandler.java
│ │ └── utils
│ │ ├── AppliationUtil.java
│ │ ├── BitmapUtil.java
│ │ └── InactivityTimer.java
│ └── res
│ ├── drawable
│ │ ├── app_icon_s.png
│ │ ├── button.xml
│ │ ├── button_a.xml
│ │ ├── button_b.xml
│ │ ├── button_text_color.xml
│ │ ├── cic_disclaimer.png
│ │ ├── cic_disclaimer_selected.png
│ │ ├── cic_info.png
│ │ ├── cic_info_selected.png
│ │ ├── circle_shape.xml
│ │ ├── powered_by_dialog.png
│ │ ├── radio_button.xml
│ │ └── radio_button_text_color.xml
│ ├── drawable-hdpi
│ │ ├── cic_paired.png
│ │ ├── ic_error_outline_black_36dp.png
│ │ ├── ic_info_outline_black_36dp.png
│ │ ├── ic_menu_refresh.png
│ │ └── splash_bg.jpg
│ ├── drawable-mdpi
│ │ ├── cic_paired.png
│ │ ├── ic_error_outline_black_36dp.png
│ │ ├── ic_info_outline_black_36dp.png
│ │ ├── ic_menu_refresh.png
│ │ └── splash_bg.jpg
│ ├── drawable-xhdpi
│ │ ├── cic_paired.png
│ │ ├── ic_error_outline_black_36dp.png
│ │ ├── ic_info_outline_black_36dp.png
│ │ ├── ic_menu_refresh.png
│ │ └── splash_bg.jpg
│ ├── drawable-xxhdpi
│ │ ├── cic_paired.png
│ │ ├── ic_error_outline_black_36dp.png
│ │ ├── ic_info_outline_black_36dp.png
│ │ └── splash_bg.jpg
│ ├── drawable-xxxhdpi
│ │ ├── ic_error_outline_black_36dp.png
│ │ └── ic_info_outline_black_36dp.png
│ ├── layout
│ │ ├── activity_device.xml
│ │ ├── activity_fragment.xml
│ │ ├── activity_scan.xml
│ │ ├── ap_config.xml
│ │ ├── device_container.xml
│ │ ├── device_file_list.xml
│ │ ├── device_info_item.xml
│ │ ├── device_main.xml
│ │ ├── device_parameter_settings.xml
│ │ ├── disconnect_drawer_button.xml
│ │ ├── factory_test.xml
│ │ ├── fragment_disclaimer.xml
│ │ ├── fragment_splash.xml
│ │ ├── progress.xml
│ │ ├── scan_item_row.xml
│ │ └── scan_list_item.xml
│ ├── menu
│ │ └── main.xml
│ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ ├── mipmap-ldpi
│ │ └── ic_launcher.png
│ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ ├── values
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-w820dp
│ │ └── dimens.xml
│ └── xml
│ └── app_info.xml
├── build
│ └── android-profile
│ ├── profile-2019-01-25-17-09-59-130.rawproto
│ ├── profile-2019-01-25-17-26-19-799.rawproto
│ ├── profile-2019-01-25-17-29-52-375.rawproto
│ └── profile-2019-01-25-17-38-38-373.rawproto
├── build.gradle
├── butterknife-7.0.1
│ ├── build.gradle
│ └── butterknife-7.0.1.jar
├── dialog-license.txt
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── license.txt
├── local.properties
├── settings.gradle
└── zxing
├── build.gradle
└── zxing.jar
45 directories, 146 files
【核心代码】
package com.dialog.suota.protocol;
import android.util.Log;
public class Packet {
static final String TAG = "Packet";
public static final byte PACKET_HEAD = (byte)0xAA;
public static final byte PACKET_TAIL = (byte)0x55;
public static final byte PACKET_TRAN = (byte)0xCC;
public static final byte PACKET_OK = 0x00;
public static final byte PACKET_LEN_ERROR = 0x01;
public static final byte PACKET_CRC_ERROR = 0x02;
public byte cmdId;
public byte option;
public ByteArray data;
public ByteArray payLoad;
public Packet() {
data = new ByteArray();
payLoad = new ByteArray();
}
/** 解析协议数据包信息
* @return
*/
public byte toParse() {
data = new ByteArray();
//获取所有数据(除去最后一个字节CRC)
data.add(payLoad.remove(payLoad.getLength() - 1));
//计算校验码
byte crc8 = Crc.cal_crc8(data.getBytes());
//获取数据包长度
int length = data.getByte() << 8 | data.getByte();
//获取协议选项
option = data.getByte();
//获取命令ID
cmdId = data.getByte();
if (length != (data.getLength() 2)) {
Log.d(TAG, "PACKET_LEN_ERROR");
return PACKET_LEN_ERROR;
}
if (crc8 != payLoad.getByte()) {
Log.d(TAG, "PACKET_CRC_ERROR");
return PACKET_CRC_ERROR;
}
return PACKET_OK;
}
/**
* 添加需要封包的成员
* @param member
*/
public void append(WrapInterface member) {
byte[] result = member.getPayload();
data.add(result);
}
/**
* 协议数据包封包方法,根据包协议得到需要封包的数据(如:计算CRC);在数据最前面
* 添加包头(PACKET_HEAD)、最后面添加包尾(PACKET_TAIL);如果包中数据出现包头、
* 包尾字节,将其用转义字节(PACKET_TRAN)代替,同时把该字节加1后添加到转义字节后面。
* @return
*/
public byte[] getPayload() {
ByteArray body = new ByteArray();
ByteArray payLoad = new ByteArray();
//总长度 = data的长度 1(cmdId的长度) 1(option的长度)
int bodyLength = data.getLength() 2;
//填充长度
body.add((byte)((bodyLength >> 8) & 0xFF));
body.add((byte)((bodyLength >> 0) & 0xFF));
//填充协议选项
body.add(option);
//填充命令ID
body.add(cmdId);
//填充数据区域
body.add(data.getBytes());
byte crc8 = Crc.cal_crc8(body.getBytes());
//填充CRC
body.add(crc8);
byte[] data = body.getBytes();
payLoad.add((byte)PACKET_HEAD);
for (int i = 0; i < body.getLength(); i ) {
byte b = data[i];
if (b == PACKET_HEAD ||
b == PACKET_TAIL ||
b == PACKET_TRAN) {
payLoad.add((byte) PACKET_TRAN);
payLoad.add( b);
} else {
payLoad.add(b);
}
}
payLoad.add((byte)PACKET_TAIL);
return payLoad.getBytes();
}
/**
* 数据流转数据包方法,根据数据流中的包头(PACKET_HEAD)、包尾(PACKET_TAIL)
* 接收数据包,如果包中数据出现转义字节(PACKET_TRAN),其后的一个字节减1就是
* 真实的数据(舍弃转义字节)。
* @param data
* @return 解包成功返回:true 否则返回:false
*/
public boolean stream2packet(ByteArray data) {
while(data.getLength() > 0 && payLoad.getLength() == 0) {
if(data.getByte() == PACKET_HEAD) {
break;
}
}
byte b = 0;
do {
b = data.getByte();
if (b == PACKET_TRAN) {
b = data.getByte();
if (b == PACKET_HEAD ||
b == PACKET_TAIL ||
b == PACKET_TRAN) {
payLoad.remove(this.payLoad.getLength());
return false;
}
payLoad.add(--b);
} else if (b == PACKET_HEAD){
payLoad.remove(this.payLoad.getLength());
} else if (b == PACKET_TAIL) {
if (toParse() == PACKET_OK) return true;
payLoad.remove(this.payLoad.getLength());
return false;
} else {
payLoad.add(b);
}
} while (data.getLength() > 0);
return false;
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论