当前位置: 首页 > news >正文

食品网站建设建议用wordpress赚钱

食品网站建设建议,用wordpress赚钱,网站商城建站,电子类 购物网站Ble蓝牙App#xff08;二#xff09;连接与发现服务 前言正文一、BlePeripheral回调二、连接和断连三、连接状态回调四、发现服务五、服务提供者六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理#xff0c;本文中进行连接和发现服务的数据处理#xff0c;运行… Ble蓝牙App二连接与发现服务 前言正文一、BlePeripheral回调二、连接和断连三、连接状态回调四、发现服务五、服务提供者六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理本文中进行连接和发现服务的数据处理运行效果图如下所示 正文 现在我们在ScanSlice扫描设备选中一个设备进入MainAbilitySlice下面要对选中的设备进行处理首先我们来做连接。 一、BlePeripheral回调 在之前我们写了一个BleCore这里面是对扫描的封装那么对于连接来说我们同样可以封装到这里我们可以在BleCore中写一个BleDeviceCallback 类继承自BlePeripheralCallback 代码如下所示 private class BleDeviceCallback extends BlePeripheralCallback {/*** 连接状态改变* param connectionState 状态码*/Overridepublic void connectionStateChangeEvent(int connectionState) {}/*** 发现服务* param status 状态*/Overridepublic void servicesDiscoveredEvent(int status) {}}因为本文要做的事情是连接和发现服务所以我们就先重写这两个方法注意一点的是蓝牙的操作都是在子线程中进行的如果我们需要知道当前是否连接则需要写一个接口用于回调到MainAbilitySlice中在core包下新建一个BleCallback接口代码如下所示 public interface BleCallback {/*** 设备的所有信息** param info 信息*/void deviceInfo(String info);/*** 连接状态** param state true or false*/void connectionStateChange(boolean state);/*** 发现服务** param services 服务列表*/void servicesDiscovered(ListGattService services); }接口中定义了三个方法通过注释我们清晰的知道都是什么作用这里着重介绍第一个函数这个函数会显示设备各个时候的状态信息从连接之后的所有动作如果我们需要保存设备的操作日志的话可以通过这个来进行处理保存。 然后回到BleCore声明变量和设置接口回调的方法 private final BleDeviceCallback mBleDeviceCallback;private BleCallback bleCallback;private BlePeripheralDevice mDevice;private boolean mIsConnected;public BleCore(Context context) {...//蓝牙设备类mBleDeviceCallback new BleDeviceCallback();} public void setBleCallback(BleCallback bleCallback) {this.bleCallback bleCallback;}private void deviceInfo(String info) {if (bleCallback ! null) {bleCallback.deviceInfo(info);}}private void connectState(boolean state) {mIsConnected state;if (bleCallback ! null) {bleCallback.connectionStateChange(state);}}public void setDevice(BlePeripheralDevice device) {mDevice device;}这里就是对设备信息和连接做了一个处理下面我们增加连接和断连的方法。 二、连接和断连 在BleCore中增加如下代码 public boolean isConnected() {return mIsConnected;}public void connect() {if (mDevice null) return;deviceInfo(连接设备...);mDevice.connect(false, mBleDeviceCallback);}public void disconnect() {if (mDevice null) return;deviceInfo(断开连接设备...);mDevice.disconnect();}连接与断开连接调用时会触发connectionStateChangeEvent()方法。 三、连接状态回调 下面修改这个方法的代码如下所示 Overridepublic void connectionStateChangeEvent(int connectionState) {String address mDevice.getDeviceAddr();if (connectionState ProfileBase.STATE_CONNECTED) {deviceInfo(连接成功 address);connectState(true);} else if (connectionState ProfileBase.STATE_DISCONNECTED) {deviceInfo(断开连接成功 address);connectState(false);mDevice.close();}}在回调中连接成功和断开连接都会有一个对应的状态码通过状态回调到接口函数中然后回到MainAbilitySlice中使用一下这个回调首先我们修改一下ability_main.xml中的代码如下所示 ?xml version1.0 encodingutf-8? DirectionalLayoutxmlns:ohoshttp://schemas.huawei.com/res/ohosohos:heightmatch_parentohos:widthmatch_parentohos:alignmentcenterohos:background_element$color:bg_colorohos:orientationverticalDirectionalLayoutohos:height50vpohos:widthmatch_parentohos:alignmentvertical_centerohos:background_element$color:blueohos:orientationhorizontalohos:start_padding12vpTextohos:heightmatch_contentohos:widthmatch_contentohos:text操作设备ohos:text_color#FFFohos:text_fontHwChinese-mediumohos:text_size18fpohos:weight1/Textohos:id$id:tx_disconnectohos:heightmatch_contentohos:widthmatch_contentohos:end_margin6vpohos:padding8vpohos:text断开连接ohos:text_color#FFFohos:text_size14fp//DirectionalLayoutTextohos:id$id:tx_device_infoohos:heightmatch_contentohos:widthmatch_parentohos:text设备信息ohos:padding12vpohos:text_size14fp/ListContainerohos:id$id:lc_serviceohos:heightmatch_parentohos:widthmatch_parent//DirectionalLayout在XML中只增加了两个Text分别用于断连和显示设备状态下面我们写Slice之间的跳转也就是从ScanSlice跳转到MainAbilitySlice。首先我们在MainAbility中增加action代码如下所示 public class MainAbility extends Ability {Overridepublic void onStart(Intent intent) {...// add action for abilityaddActionRoute(action.main, MainAbilitySlice.class.getName());} }然后去config.json中增加配置如下图所示 然后我们回到ScanSlice中在Item的点击事件中添加如下代码 //列表item点击监听lcDevice.setItemClickedListener((listContainer, component, position, id) - {//设置设备bleCore.setDevice(mList.get(position).getDevice());Intent jumpIntent new Intent();Operation operation new Intent.OperationBuilder().withAction(action.main).withDeviceId().withBundleName(com.llw.ble).withAbilityName(com.llw.ble.MainAbility).build();jumpIntent.setOperation(operation);startAbility(jumpIntent);});这里跳转的代码比较多跳转之前设置了设备进去这种方式也是官方推荐的方式。然后我们修改MainAbility中的代码如下所示 public class MainAbilitySlice extends AbilitySlice implements BleCallback {private static final String TAG MainAbilitySlice.class.getSimpleName();private Text txDisconnect;private Text txDeviceInfo;private ListContainer lcService;private BleCore bleCore;Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);txDisconnect (Text) findComponentById(ResourceTable.Id_tx_disconnect);txDeviceInfo (Text) findComponentById(ResourceTable.Id_tx_device_info);lcService (ListContainer) findComponentById(ResourceTable.Id_lc_service);bleCore BleApp.getBleCore();bleCore.setBleCallback(this);//连接设备bleCore.connect();txDisconnect.setClickedListener(component - {if (bleCore.isConnected()) {bleCore.disconnect();} else {bleCore.connect();}});}Overridepublic void deviceInfo(String info) {getUITaskDispatcher().asyncDispatch(() - {LogUtils.LogD(TAG, info);txDeviceInfo.setText(info);});}Overridepublic void connectionStateChange(boolean state) {getUITaskDispatcher().asyncDispatch(() - txDisconnect.setText(state ? 断开连接 : 连接));}Overridepublic void servicesDiscovered(ListGattService services) {} }使用BleCore的connect()方法进行连接设备在onStart()方法中进行BleCore的赋值然后设置Ble的回调实现BleCallback接口重写里面的函数当连接成功之后会通过回调deviceInfo()得到设备状态因为是子线程所以在ui线程中渲染UI。而connectionStateChange()函数回调连接成功或者失败如果成功则为ture就显示txDisconnect控件此时连接成功点击这个txDisconnect就会断开连接点击监听就在onStart()中写好了下面我们运行一下看看效果。 从这个效果图来看我们连接成功之后有状态点击断开连接也会有状态改变那么连接就写好了。 四、发现服务 连接写好了下面可以写发现服务了我们可以在连接成功的处理中进行发现服务下面我们修改一下BleDeviceCallback中的connectionStateChangeEvent()方法中的代码如下图所示 通过mDevice.discoverServices()进行发现服务的动作在此之前通过deviceInfo()设置当前的动作状态发现服务执行会触发servicesDiscoveredEvent()回调在这个回调中我们可以回调到页面修改代码如下所示 Overridepublic void servicesDiscoveredEvent(int status) {if (status BlePeripheralDevice.OPERATION_SUCC) {deviceInfo(发现 mDevice.getServices().size() 服务);if (bleCallback ! null) {bleCallback.servicesDiscovered(mDevice.getServices());}}}在回调中设置发现服务的个数然后回调因为服务是多个的那么下面我们就需要使用一个列表是装载服务之前我们就已经在ability_main.xml中写好了。 五、服务提供者 要显示服务列表数据首先需要一个提供者而提供者又需要一个item去渲染数据下面我们在layout下创建一个item_service.xml代码如下所示 ?xml version1.0 encodingutf-8? DependentLayoutxmlns:ohoshttp://schemas.huawei.com/res/ohosohos:heightmatch_contentohos:widthmatch_parentohos:background_element$color:whiteohos:bottom_margin2vpohos:bottom_padding8vpohos:end_padding16vpohos:start_padding16vpohos:top_padding8vpTextohos:id$id:tx_service_nameohos:heightmatch_contentohos:widthmatch_contentohos:text服务ohos:text_size16fp/Buttonohos:id$id:tx_uuid_titleohos:heightmatch_contentohos:widthmatch_contentohos:below$id:tx_service_nameohos:textUUIDohos:text_color$color:grayohos:text_size16fpohos:top_margin2vp/Buttonohos:id$id:tx_uuidohos:heightmatch_contentohos:widthmatch_contentohos:below$id:tx_service_nameohos:end_of$id:tx_uuid_titleohos:textUUIDohos:text_size16fpohos:top_margin2vp/Buttonohos:id$id:tx_service_infoohos:heightmatch_contentohos:widthmatch_contentohos:below$id:tx_uuid_titleohos:textPRIMARY SERVICEohos:text_color$color:grayohos:text_size16fpohos:top_margin2vp//DependentLayout下面我们在ble包下新建一个BleUtils类代码如下所示 public class BleUtils {public static final String generic -0000-1000-8000-00805F9B34FB;public static String getServiceUUID(UUID uuid) {return 0x uuid.toString().substring(4, 8).toUpperCase();}/*** 获取蓝牙服务名称** param uuid UUID*/public static String getServiceName(UUID uuid) {String targetUuid getServiceUUID(uuid);switch (targetUuid) {case 0x1800:return Generic Access service;case 0x1801:return Generic Attribute service;case 0x1802:return Immediate Alert service;case 0x1803:return Link Loss service;case 0x1804:return Tx Power service;case 0x1805:return Current Time service;case 0x1806:return Reference Time Update service;case 0x1807:return Next DST Change service;case 0x1808:return Glucose service;case 0x1809:return Health Thermometer service;case 0x180A:return Device Information service;case 0x180D:return Heart Rate service;case 0x180E:return Phone Alert Status service;case 0x180F:return Battery service;case 0x1810:return Blood Pressure service;case 0x1811:return Alert Notification service;case 0x1812:return Human Interface Device service;case 0x1813:return Scan Parameters service;case 0x1814:return Running Speed and Cadence service;case 0x1815:return Automation IO service;case 0x1816:return Cycling Speed and Cadence service;case 0x1818:return Cycling Power service;case 0x1819:return Location and Navigation service;case 0x181A:return Environmental Sensing service;case 0x181B:return Body Composition service;case 0x181C:return User Data service;case 0x181D:return Weight Scale service;case 0x181E:return Bond Management service;case 0x181F:return Continuous Glucose Monitoring service;case 0x1820:return Internet Protocol Support service;case 0x1821:return Indoor Positioning service;case 0x1822:return Pulse Oximeter service;case 0x1823:return HTTP Proxy service;case 0x1824:return Transport Discovery service;case 0x1825:return Object Transfer service;case 0x1826:return Fitness Machine service;case 0x1827:return Mesh Provisioning service;case 0x1828:return Mesh Proxy service;case 0x1829:return Reconnection Configuration service;case 0x183A:return Insulin Delivery service;case 0x183B:return Binary Sensor service;case 0x183C:return Emergency Configuration service;case 0x183D:return Authorization Control service;case 0x183E:return Physical Activity Monitor service;case 0x183F:return Elapsed Time service;case 0x1840:return Generic Health Sensor service;case 0x1843:return Audio Input Control service;case 0x1844:return Volume Control service;case 0x1845:return Volume Offset Control service;case 0x1846:return Coordinated Set Identification service;case 0x1847:return Device Time service;case 0x1848:return Media Control service;case 0x1849:return Generic Media Control service;case 0x184A:return Constant Tone Extension service;case 0x184B:return Telephone Bearer service;case 0x184C:return Generic Telephone Bearer service;case 0x184D:return Microphone Control service;case 0x184E:return Audio Stream Control service;case 0x184F:return Broadcast Audio Scan service;case 0x1850:return Published Audio Capabilities service;case 0x1851:return Basic Audio Announcement service;case 0x1852:return Broadcast Audio Announcement service;case 0x1853:return Common Audio service;case 0x1854:return Hearing Access service;case 0x1855:return Telephony and Media Audio service;case 0x1856:return Public Broadcast Announcement service;case 0x1857:return Electronic Shelf Label service;default:return Unknown Service;}} }这里需要说明一下蓝牙的UUID蓝牙UUIDUniversally Unique Identifier是用于唯一标识蓝牙设备和服务的一种标识符。它是一个128位长的数字在蓝牙通信中起到唯一标识的作用。蓝牙UUID按照标准分为两种类型 16位UUID这些UUID通常用于蓝牙标准定义的一些通用服务和特性。例如设备名称服务的UUID是 00001800-0000-1000-8000-00805F9B34FB。 128位UUID这些UUID通常用于自定义的服务和特性以确保全球唯一性。可以自行生成一个128位的UUID作为自定义的服务或特性标识。例如一个自定义的服务UUID可以是 0000XXXX-0000-1000-8000-00805F9B34FB其中的 XXXX 部分可以是任意的16进制数字。 在蓝牙通信中设备使用UUID来发布和查找服务以及识别特性。UUID是蓝牙设备之间进行通信时的重要标识确保了设备和服务的唯一性。 那么getServiceName()中的键你就知道是什么意思了0x1800就是16进制数字而对应的值则是SIG定义的可以参考这个文档Assigned_Numbers.pdf。如果你的值找不到对应的那说明它不是SIG规范的你这个服务UUID就是自己公司自定义的。 下面我们写提供者在provider包下新建一个ServiceProvider类代码如下所示 public class ServiceProvider extends BaseItemProvider {private final ListGattService serviceList;private final AbilitySlice slice;public ServiceProvider(ListGattService list, AbilitySlice slice) {this.serviceList list;this.slice slice;}Overridepublic int getCount() {return serviceList null ? 0 : serviceList.size();}Overridepublic Object getItem(int position) {if (serviceList ! null position 0 position serviceList.size()) {return serviceList.get(position);}return null;}Overridepublic long getItemId(int position) {return position;}Overridepublic Component getComponent(int position, Component component, ComponentContainer componentContainer) {final Component cpt;ServiceHolder holder;GattService service serviceList.get(position);if (component null) {cpt LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_item_service, null, false);holder new ServiceHolder(cpt);//将获取到的子组件信息绑定到列表项的实例中cpt.setTag(holder);} else {cpt component;// 从缓存中获取到列表项实例后直接使用绑定的子组件信息进行数据填充。holder (ServiceHolder) cpt.getTag();}holder.txServiceName.setText(BleUtils.getServiceName(service.getUuid()));holder.txUuid.setText(BleUtils.getServiceUUID(service.getUuid()));return cpt;}/*** 用于保存列表项的子组件信息*/public static class ServiceHolder {Text txServiceName;Text txUuid;public ServiceHolder(Component component) {txServiceName (Text) component.findComponentById(ResourceTable.Id_tx_service_name);txUuid (Text) component.findComponentById(ResourceTable.Id_tx_uuid);}} }这里的代码就是比较简单的就是基本的写法下面回到MainAbilitySlice中进行显示数据。 六、显示服务 首先声明变量 private final ListGattService serviceList new ArrayList();private ServiceProvider serviceProvider;然后实现OnItemClickListener 接口 public class MainAbilitySlice extends AbilitySlice implements BleCallback, ListContainer.ItemClickedListener {重写onItemClicked()方法并且增加了一个showMsg这个Toast的可定制化做的很多。 Overridepublic void onItemClicked(ListContainer listContainer, Component component, int position, long id) {showMsg(serviceList.get(position).getUuid().toString());}private void showMsg(String msg) {ToastDialog toastDialog new ToastDialog(getContext());toastDialog.setSize(DirectionalLayout.LayoutConfig.MATCH_CONTENT, DirectionalLayout.LayoutConfig.MATCH_CONTENT);toastDialog.setDuration(2000);toastDialog.setText(msg);toastDialog.setAlignment(LayoutAlignment.CENTER);Text toastText (Text) toastDialog.getComponent();if (toastText ! null) {toastText.setMultipleLine(true);toastText.setTextSize(14, Text.TextSizeType.FP);toastText.setTextColor(Color.WHITE);toastText.setPadding(40, 20, 40, 20);ShapeElement toastBackground new ShapeElement();toastBackground.setRgbColor(new RgbColor(24, 196, 124));toastBackground.setCornerRadius(60f);toastText.setBackground(toastBackground);}toastDialog.show();}然后在onStart()方法中初始化服务提供者代码如下所示 Overridepublic void onStart(Intent intent) {...serviceProvider new ServiceProvider(serviceList, this);lcService.setItemProvider(serviceProvider);lcService.setItemClickedListener(this);}修改servicesDiscovered()方法代码如下所示 Overridepublic void servicesDiscovered(ListGattService services) {getUITaskDispatcher().asyncDispatch(() - {serviceList.clear();serviceList.addAll(services);serviceProvider.notifyDataChanged();});}这里的写法其实和扫描设备哪里如出一辙下面我们运行一下看看什么效果。 七、源码 如果对你有所帮助的话不妨 Star 或 Fork山高水长后会有期~ 源码地址HarmonyBle-Java
http://www.pierceye.com/news/420959/

相关文章:

  • 重庆 网站开发如何将网站提交到搜索引擎
  • 怎么把网站封包做app网页设计基础开题报告及网页流程图
  • 网上购物网站开发的背景网站开发与应用 论文
  • 广州做网站哪个公司做得好优化设计方法
  • ie的常用网站企业文化建设网站
  • 网站广告是文化事业建设费系统客户管理软件
  • 企业网站用个人备案佛山网站建设公司哪个性比价好些
  • 深圳龙华做网站公司网络平面设计包括哪些
  • 高清素材网站无水印我要找人做网站的主页
  • 手机网站 程序网站备案要关多久
  • 网站需要具备条件在线用代码做网站
  • 代码下载网站河北恒山建设集团网站
  • 网站设计应遵循的原则做企业网站有哪些好处
  • 网站不用域名解绑商务网站建设的一般流程是什么?
  • 企业网站的运营如何做秦皇岛网站制作与网站建设
  • 潍坊 营销型网站建设室内设计和装修设计
  • 滕州市东方建设工程事务有限公司网站房房网
  • php网站漂浮广告代码百度一下打开网页
  • 华为公司网站建设方案模板自己做网站的费用
  • 网站设计命名规范广州短视频内容营销平台
  • 天津专门做网站的公司成都市城乡建设局网站
  • 品牌网站升级wordpress 4.9中文
  • 网站搭建软件广告标识标牌制作公司
  • 做造价在哪个网站查价格微信小程序是什么语言开发的
  • 网站建设平台接单做电子商务平台网站需要多少钱
  • 甘肃网站seo技术厂家企业简介内容
  • 视觉中国设计网站做音乐网站
  • 金坛区建设工程质量监督网站西宁百姓网免费发布信息
  • 运维 网站开发网站如何引入流量
  • 网站建设泉州效率网络西安网站设计公司哪家好