首页
苏兮影视
随笔记
壁纸
更多
直播
时光轴
友联
关于
统计
Search
1
软件添加id功能按钮
708 阅读
2
v2ray节点搭建
508 阅读
3
typecho非常有特色的模块
460 阅读
4
QQxml消息卡片生成源码
421 阅读
5
Linux下提权常用小命令
367 阅读
谈天说地
建站源码
经验教程
资源分享
动漫美图
登录
Search
标签搜索
java
flutter
springboot
rust
安卓
linux
vue
docker
joe
快捷键
git
fish shell
maven
redis
netty
dart
groovy
js
设计模式
rpc
尽意
累计撰写
95
篇文章
累计收到
38
条评论
首页
栏目
谈天说地
建站源码
经验教程
资源分享
动漫美图
页面
苏兮影视
随笔记
壁纸
直播
时光轴
友联
关于
统计
搜索到
95
篇与
的结果
2023-02-04
MqttAndroidClient的使用
MQTT协议特点MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。它的核心设计思想是开源、可靠、轻巧、简单,具有以下主要的几项特性:非常小的通信开销(最小的消息大小为 2 字节);支持各种流行编程语言(包括C,Java,Ruby,Python 等等)且易于使用的客户端;支持发布 / 预定模型,简化应用程序的开发;提供三种不同消息传递等级,让消息能按需到达目的地,适应在不稳定工作的网络传输需求应项目要求使用MQTT协议实现客户端与服务端通信。Android端使用MqttAndroidClient实现MQTT通信:MqttAndroidClientMqttAndroidClient配置{timeline}{timeline-item color="#19be6b"} 添加依赖{/timeline-item}{timeline-item color="#19be6b"} 声明权限{/timeline-item}{timeline-item color="#19be6b"} 配置服务{/timeline-item}{timeline-item color="#19be6b"} 功能实现{/timeline-item}{/timeline}{mtitle title="添加依赖"/}在项目根目录下的build.gradle中添加:repositories { maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" } }在app目录下的build.gradle中添加: dependencies { implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' //eventbus 各个组件之间进行通信 implementation 'org.greenrobot:eventbus:3.1.1' }{mtitle title="权限声明"/}在AndroidManifest.xml中添加: <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />{mtitle title="配置服务"/}在AndroidManifest.xml中添加: <service android:name=".MQTTService" android:enabled="true" android:exported="true" /> <service android:name="org.eclipse.paho.android.service.MqttService" />{mtitle title="功能实现"/}MQTTService.javaimport android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import org.eclipse.paho.android.service.MqttAndroidClient; import org.eclipse.paho.client.mqttv3.IMqttActionListener; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttToken; import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.greenrobot.eventbus.EventBus; public class MQTTService extends Service { private static MqttAndroidClient mqttAndroidClient;//声明 final String serverUri = "tcp://43.139.79.48:1883";//mqtt地址 String clientId = "hello";//客户端的ID public static String subscriptionTopic = "test";//订阅的主题 public static String publishTopic = "test";//发布的主题 public MQTTService() { } //与mainactivit之间通信的 class MyBinder extends Binder{ //activity与service之间进行通信的桥梁 } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. Log.i("MQTTService","mqttService start"); mqttinit();//mqtt的初始化 return new MyBinder();//返回Binder的实例 } //mqtt的初始化 private void mqttinit() { mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), serverUri, clientId); //设置回调函数 mqttAndroidClient.setCallback(new MqttCallbackExtended() { //连接完成时,自动调用 @Override public void connectComplete(boolean reconnect, String serverURI) { Log.i("TempMqtt", "connectComplete: 连接成功"); //订阅主题 subscribeToTopic(); } //连接失去的调用 @Override public void connectionLost(Throwable cause) { Log.i("TempMqtt", "connectComplete: 断开连接"); } //接收到消息的时候 @Override public void messageArrived(String topic, MqttMessage message) throws Exception { Log.e("TempMqtt", "connectComplete: 收到消息"+message.toString()); String str=message.toString(); //接受的消息,发布到eventbus,post EventBus.getDefault().post(new MessageEvent(str)); } //发送消息完成 @Override public void deliveryComplete(IMqttDeliveryToken token) { } }); //完成 mqtt连接 MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();//定义一个mqttConnectOptions mqttConnectOptions.setAutomaticReconnect(true);//自动重连 mqttConnectOptions.setCleanSession(false);//不清除会话 try { mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { //Toast.makeText("MQTTService", "连接成功", Toast.LENGTH_SHORT).show(); Log.i("MQTTService", "onSuccess: 连接成功"); //进行主题的订阅 subscribeToTopic(); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { // Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show(); Log.i("MQTTService", "onSuccess: 连接失败"); } }); } catch (MqttException ex){ ex.printStackTrace(); } } //订阅主题 public static void subscribeToTopic() { try { mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() { //订阅成功的时候,就会调用 @Override public void onSuccess(IMqttToken asyncActionToken) { //Toast.makeText(MainActivity.this, "订阅成功", Toast.LENGTH_SHORT).show(); Log.i("TempMqtt", "onSuccess: 订阅成功"); } //订阅失败的时候,就会调用 @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { //Toast.makeText(MainActivity.this, "订阅失败", Toast.LENGTH_SHORT).show(); Log.i("TempMqtt", "onSuccess: 订阅失败"); } }); } catch (MqttException ex){ Log.i("" + "", "onSuccess: Exception whilst subscribing"); ex.printStackTrace(); } } //发布主题 public static void publishToTopic(String message){ try { //参数分别为:主题、消息的字节数组、服务质量、是否在服务器保留断开连接后的最后一条消息 mqttAndroidClient.publish(publishTopic, message.getBytes(), 0, false); Log.i("TempMqtt", "publishToTopic: 发送消息为"+message); } catch (MqttException e) { e.printStackTrace(); } } }MessageEvent.java//然后,我们定义一个事件的封装对象。在程序内部就使用该对象作为通信的信息: public class MessageEvent { public final String message; public static MessageEvent getInstance(String message) { return new MessageEvent(message); } MessageEvent(String message) { this.message = message; } }MainActivity.javaimport android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.json.JSONException; import org.json.JSONObject; public class MainActivity extends AppCompatActivity { private Intent mintent; private TextView q; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mintent=new Intent(this,MQTTService.class); EventBus.getDefault().register(this);//注册EventBus bindService(mintent,connection, Context.BIND_AUTO_CREATE);//绑定方式启动服务 q= (TextView) findViewById(R.id.aa); q.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //点击文字发布消息 MQTTService.publishToTopic("hahaah"); } }); } //当接收到MQTT服务器发送过来的数据的时候,就会调用此函数 // This method will be called when a MessageEvent is posted (in the UI thread for Toast) //表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。 @Subscribe(threadMode = ThreadMode.MAIN,sticky = true) public void onReceiveMsg(@NonNull MessageEvent event){ String str=event.message; //在这里,可以进行UI界面的更新 UiShow(str); } private void UiShow(String str ){ try { JSONObject jsonMessage=new JSONObject(str); String temp= jsonMessage.getString("msg"); //Toast.makeText(this, temp, Toast.LENGTH_SHORT).show(); q.setText(temp); } catch (JSONException e) { e.printStackTrace(); } } //新建了一个 ServiceConnection 实例 private ServiceConnection connection=new ServiceConnection() { //当service与activity连接的时候,调用此方法 @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { } //当service与activity失去连接的时候,调用此方法 @Override public void onServiceDisconnected(ComponentName componentName) { } }; @Override protected void onDestroy() { EventBus.getDefault().unregister(this);//注销、 unbindService(connection);//解除绑定 stopService(mintent);//停止mqtt的服务 super.onDestroy(); } } 在activity_main.xml中,给TextView赋值idandroid:id="@+id/aa"最终效果
2023年02月04日
121 阅读
1 评论
1 点赞
Android连接mqtt闪退解决方案
集成android mqtt的时候报错:java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/localbroadcastmanager/content/LocalBroadcastManager;在谷歌官网找到这个类被废弃了,应该是mqtt源码实现使用了这个类,导致找不到类而报错,解决方案是:在build.gradle里添加依赖:implementation 'com.android.support:support-v4:30.4.1'其中30:是指你的编译版本,这个操作应该是,v4兼容包里有LocalBroadcastManager。添加了依赖之后报错:这是因为有混合库添加了依赖的原因,这时我们可以在gradle.properties文件中添加一句话,让它支持混合库使用。android.enableJetifier=true问题解决
2023年02月04日
113 阅读
0 评论
1 点赞
安卓隐显示启动
一、Activity 显式启动 (代码示例):public class MyActivity extends Activity { Button buttonStart; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonStart = (Button) findViewById(R.id.start); buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //显示启动 Intent intent = new Intent(); intent.setClass(MyActivity.this, SecondActivity.class); startActivity(intent); } }); } }...二、Activity 隐式启动 (代码示例):public class MyActivity extends Activity { Button buttonStart; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonStart = (Button) findViewById(R.id.start); buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //隐式启动 Intent intent = new Intent(); intent.setAction("asdf.SecondActivity"); startActivity...
2022年11月21日
118 阅读
2 评论
1 点赞
2022-11-20
Maya快捷键
Enter 完成当前操作 ~ 终止当前操作Insert 插入工具编辑模式W 移动工具e 旋转工具r 缩放工具 操纵杆操作y 非固定排布工具s 设置关键帧i 插入关键帧模式(动画曲线编辑)Shift E 存储旋转通道的关键帧Shift R 存储缩放通道的关键帧Shift W 存储转换通道的关键帧Shift Q 选择工具,(切换到)成分图标菜单 Alt q 选择工具,(切换到)多边形选择图标菜单 q 选择工具,(切换到)成分图标菜单 t 显示操作杆工具= 增大操纵杆显示尺寸减少操纵杆显示尺寸 窗口和视图设置 移动被选对象快捷键 功能解释 快捷键 功能解释Ctrl a 弹出属性编辑窗/显示通道栏a 满屏显示所有物体(在激活的视图)f 满屏显示被选目标Shift F 在所有视图中满屏显示被选目标Shift A 在所有视图中满屏显示所有对象 ' 设置键盘的中心集中于命令行空格键 快速切换单一视图和多视图模式Alt ↑ 向上移动一个象素Alt ↓ 向下移动一个象素Alt ← 向左移动一个象素Alt → 向右移动一个象素Alt '设置键盘中心于数字输入行播放控制 选择物体和成分快捷键 功能解释 快捷键 功能解释Alt 。 在时间轴上前进一帧 Alt , 在时间轴上后退一帧. 前进到下一关键帧, 后退到上一关键帧Alt v 播放按钮(打开/关闭)Alt/Shift V 回到最小帧K 激活模拟时间滑块F8 切换物体/成分编辑模式F9 选择多边形顶点F10 选择多边形的边F11 选择多边形的面F12 选择多边形的UVsCtrl I 选择下一个中间物体Ctrl F9 选择多边形的顶点和面 显示设置 快捷菜单显示快捷键 功能解释快捷键 功能解释鼠标左键4 网格显示模式 5 实体显示模式6 实体和材质显示模式7 灯光显示模式d 设置显示质量(弹出式标记菜单)空格键 弹出快捷菜单(按下)空格键 隐藏快捷菜单(释放)Alt m 快捷菜单显示类型(恢复初始类型)1 低质量显示 2 中等质量显示3 高质量显示] 重做视图的改变[ 撤消视图的改变Alt s 旋转手柄附着状态 翻越层级 文件管理快捷键 功能解释 快捷键 功能解释↑ 进到当前层级的上一层级↓ 退到当前层级的下一层级← 进到当前层级的左侧层级→ 进到当前层级的右侧层级Ctrl N 建立新的场景Ctrl O 打开场景Ctrl S 存储场景1 桌面文件管理(IPX版本专有) 雕刻笔设置 菜单模式选择快捷键 功能解释快捷键 功能解释Alt f 扩张当前值 Ctrl m 显示(关闭)+主菜单Alt r 激活双重作用(开启/关闭) 鼠标右键h 转换菜单栏(标记菜单)Alt a 显示激活的线框(开启/关闭) F2 显示动画菜单Alt c 色彩反馈(开启/关闭) F3 显示建模菜单鼠标左键u 切换雕刻笔作用方式(弹出式标记菜单) F4 显示动力学菜单o 修改雕刻笔参考值 F5 显示渲染菜单b 修改笔触影响力范围(按下/释放) 吸附操作m 调整最大偏移量(按下/释放) 快捷键 功能解释n 修改值的大小(按下/释放) C 吸附到曲线(按下/释放)/ 拾取色彩模式--用于:绘制成员资格、绘制权重、属性绘制、绘制每个顶点色彩工具 X 吸附到网格(按下/释放), 选择丛(按下/释放)-用于绘制权重工具 V 吸附到点(按下/释放)编辑操作(显示/隐藏)对象快捷键 功能解释快捷键 功能解释z 取消(刚才的操作) Ctrl h 隐藏所选对象Shift Z 重做(刚才的操作) Ctrl/Shift H 显示上一次隐藏的对象g 重复(刚才的操作) 三键鼠操作Shift G 重复鼠标位置的命令 快捷键 功能解释Ctrl d 复制 Alt+鼠标右键 旋转视图Shift D 复制被选对象的转换 Alt+鼠标中键 移动视图Ctrl g 组成群组 Alt+鼠标右键+鼠标中键缩放视图p 制定父子关系 Alt+Ctrl+鼠标右键 框选放大视图Shift P 取消被选物体的父子关系 Alt+Ctrl+鼠标中键 框选缩小视图MAYA快捷键大全1 :低质量显示2 :中等质量显示3 :高质量显示4 :网格显示5 :实体显示模式6 :实体和材质显示模式7 :灯光显示模式D+左健 :设置显示质量F8 :切换物体/元素编辑模式F9 :选择物体顶点F10 :选择物体的边F11 : 选择物体的面F12 : 选择UVS Ctrl+I 选择下一个中间物体Ctrl+F9 :选择多边形的顶点和面A :吸附到曲线X 吸附到网格V :吸附到点S :设置关键帧I :插入关键帧。 :前进到下一关键帧 , :后退到下一关键帧K :击活模拟时间滑块Shift+E 储存旋转通道的关键帧Shift+R :储存缩放通道的关键帧Shift+W 储存转换通道的关键帧Alt+. 在时间轴上前进一帧Alt+, 在时间轴上后退一帧ALT+V 播放按钮Alt/Shift+V 回到最小帧回车 :完成当前操作~ 终止当前操作Inset 插入工具编辑模式W 移动工具 E旋转工具 Q 选择工具 R 放缩工具Shift+Q 选择工具,切换到成分图标菜单T 显示操作杆工具= 增大操作杆显示尺寸 - 减小操作杆显示尺寸空格(按下不松开) 弹出快捷菜单 空格 (按下立即松开) 快速切换单一视图和多视图模式ALT+M 快捷菜单显示类型CTRL+A 弹出属性编辑窗/显示通道栏A 满屏显示所有物体 (在激活的视图) F 满屏显示所被选目标Shift+F在所有视图中满屏显示被选目标 Shift+A 在所有视图中满屏显示所有对象ALT+↑ 向上移动一个象素 ALT+↓ 向下移动一个象素 ALT+← 向左移动一个象素ALT+→ 向右移动一个象素 ‘ 设置键盘的中心集中于命令行 ALT+‘ 设置键盘中心于数字输入行↑ 前进到当前层级的上一级 ↓ 退到当前层级的下一层级 ← 进到当前层级的左侧层级→ 进到当前层级的右侧层级 ] 重做视图的改变 [ 撤消视图的改变 ALT+S 旋转手柄附着状态CRL+M显示(关闭)+主菜单 空格+H 转换菜单栏(标记菜单) CTRL+N建新的场景CTRL+O 打开场景 CTRL+S 储存场景 Z 取消(刚才的操作) Shift+Z重做(刚才的操作)鼠标滑轮 放大缩小视图 CYRL+左健+中建 =ALT+右健 放大缩小视图 ALT+中健,移动视图【Enter】完成当前操作 【S】设置关键帧【~】终止当前操作 【I】 插入关键帧模式(动画曲线编辑)【Insert】插入工具编辑模式 【Shift + E】 存储旋转通道的关键帧【W】移动工具 【Shift + R】 存储缩放通道的关键帧【e】 旋转工具 【Shift + W】 存储转换通道的关键帧【r】 缩放工具操纵杆操作【y】 非固定排布工具【T】显示操作杆工具【Shift + Q】 选择工具,(切换到)成分图标菜单【Alt + Q】 选择工具,(切换到)多边形选择图标菜单【Q】 选择工具,(切换到)成分图标菜单【=】 增大操纵杆显示尺寸【-】 减少操纵杆显示尺寸〓窗口和视图设置〓 〓移动被选对象〓【Ctrl + A】 弹出属性编辑窗 / 显示通道栏 【Alt +↑】 向上移动一个象素【A】 满屏显示所有物体(在激活的视图) 【Alt +↓】 向下移动一个象素【F】 满屏显示被选目标 【Alt + ←】 向左移动一个象素【Shift + F】 在所有视图中满屏显示被选目标 【Alt + →】 向右移动一个象素【Shift + A】 在所有视图中满屏显示所有对象 【'】 设置键盘的中心集中于命令行【空格键】 快速切换单一视图和多视图模式 【Alt + '】 设置键盘中心于数字输入行〓播放控制〓 〓选择物体和成分〓【Alt + 。】 在时间轴上前进一帧 【F8】 切换物体 / 成分编辑模式【Alt + ,】 在时间轴上后退一帧 【F9】 选择多边形顶点【.】 前进到下一关键帧 【F10】 选择多边形的边【,】后退到上一关键帧 【F11】 选择多边形的面【Alt + V】 播放按钮(打开 / 关闭) 【F12】 选择多边形的 UVs【Alt + Shift + V】 回到最小帧 【Ctrl + I】 选择下一个中间物体【K】 激活模拟时间滑块 【CtrlF + 9】 选择多边形的顶点和面〓显示设置〓 〓快捷菜单显示〓〓鼠标左键〓【4】 网格显示模式 【空格键】 弹出快捷菜单(按下)【5】 实体显示模式 【空格键】 隐藏快捷菜单(释放)【6】 实体和材质显示模式 【Alt + M】 快捷菜单显示类型(恢复初始类型)【7】 灯光显示模式 混合操作【d】 设置显示质量(弹出式标记菜单)【1】 低质量显示 【]】 重做视图的改变【2】 中等质量显示 【[】 撤消视图的改变【3】 高质量显示 【Alt + s】 旋转手柄附着状态〓翻越层级〓 〓文件管理〓【↑】 进到当前层级的上一层级 【Ctrl + N】 建立新的场景【↓】 退到当前层级的下一层级 【Ctrl + O】 打开场景【←】 进到当前层级的左侧层级 【Ctrl + S】 存储场景【→】 进到当前层级的右侧层级 【1】 桌面文件管理( IPX 版本专有)〓雕刻笔设置〓 〓菜单模式选择〓【Alt + f】 扩张当前值 【Ctrl + m】 显示(关闭) + 主菜单【Alt + r】 激活双重作用(开启 / 关闭)〓鼠标右键〓【h】 转换菜单栏(标记菜单)【Alt + a】 显示激活的线框(开启 / 关闭) 【F2】 显示动画菜单【Alt + c】 色彩反馈(开启 / 关闭) 【F3】 显示建模菜单〓鼠标左键〓【u】 切换雕刻笔作用方式(弹出式标记菜单) 【F4】 显示动力学菜单【o】 修改雕刻笔参考值 【F5】 显示渲染菜单【b】 修改笔触影响力范围(按下 / 释放)〓吸附操作〓【m】 调整最大偏移量(按下 / 释放)【n】 修改值的大小(按下 / 释放)【C】 吸附到曲线(按下 / 释放)【/】 拾取色彩模式 -- 用于:绘制成员资格、绘制权重、属性绘制、绘制每个顶点色彩工具【X】 吸附到网格(按下 / 释放 )【,】 选择丛(按下 / 释放) - 用于绘制权重工具【V】 吸附到点(按下 / 释放)〓编辑操作〓 〓(显示 / 隐藏)对象〓【z】 取消(刚才的操作) 【Ctrl + h】 隐藏所选对象【Shift + Z】 重做(刚才的操作) 【Ctrl + Shift + H】 显示上一次隐藏的对象【g】 重复(刚才的操作)【Shift + G】 重复鼠标位置的命令【Ctrl + d】 复制【Shift + D】 复制被选对象的转换【Ctrl + g】 组成群组【p】 制定父子关系【Shift + P】 取消被选物体的父子关系〓三键鼠操作〓【Alt + 鼠标右键】 旋转视图【Alt + 鼠标中键】 移动视图【Alt + 鼠标右键 + 鼠标中键】 缩放视图【Alt + Ctrl + 鼠标右键】 框选放大视图【Alt + Ctrl + 鼠标中键】 框选缩小视图转载互联网
2022年11月20日
135 阅读
0 评论
1 点赞
typecho 数据库 批量修改文章内容
进入phpmyadmin后执行下面语句UPDATE `typecho_contents` SET `text` = REPLACE(`text`,'原内容','新内容');...
2022年11月19日
85 阅读
1 评论
1 点赞
1
...
15
16
17
...
19