diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt new file mode 100644 index 0000000..318d05f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RtkLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt new file mode 100644 index 0000000..318d05f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RtkLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt index 50b893c..5b483ad 100644 --- a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt +++ b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt @@ -61,15 +61,15 @@ } init { - val eventLoopGroup = NioEventLoopGroup() //设置的连接group + val eventLoopGroup = NioEventLoopGroup() bootstrap = Bootstrap() - bootstrap.group(eventLoopGroup) //设置的一系列连接参数操作等 + bootstrap.group(eventLoopGroup) .channel(NioSocketChannel::class.java) .option(ChannelOption.TCP_NODELAY, true) //无阻塞 .option(ChannelOption.SO_KEEPALIVE, true) //长连接 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) //连接超时时间 .option( - ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 1024, 65536) + ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 2048, 65536) ) .handler(object : ChannelInitializer() { override fun initChannel(socketChannel: SocketChannel) { @@ -85,7 +85,7 @@ fun connect() { synchronized(this) { try { - Log.d(kTag, "connect: 开始连接TCP服务器") + Log.d(kTag, "connect: 连接TCP服务器") //连接监听 val channelFuture = bootstrap.connect(hostname, port) .addListener(object : ChannelFutureListener { @@ -103,6 +103,11 @@ } } + fun disconnect() { + channel?.close()?.addListener(ChannelFutureListener.CLOSE) + Log.d(kTag, "disconnect: 断开TCP服务器") + } + private fun retryConnect() { try { Thread.sleep(timeout) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt new file mode 100644 index 0000000..318d05f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RtkLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt index 50b893c..5b483ad 100644 --- a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt +++ b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt @@ -61,15 +61,15 @@ } init { - val eventLoopGroup = NioEventLoopGroup() //设置的连接group + val eventLoopGroup = NioEventLoopGroup() bootstrap = Bootstrap() - bootstrap.group(eventLoopGroup) //设置的一系列连接参数操作等 + bootstrap.group(eventLoopGroup) .channel(NioSocketChannel::class.java) .option(ChannelOption.TCP_NODELAY, true) //无阻塞 .option(ChannelOption.SO_KEEPALIVE, true) //长连接 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) //连接超时时间 .option( - ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 1024, 65536) + ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 2048, 65536) ) .handler(object : ChannelInitializer() { override fun initChannel(socketChannel: SocketChannel) { @@ -85,7 +85,7 @@ fun connect() { synchronized(this) { try { - Log.d(kTag, "connect: 开始连接TCP服务器") + Log.d(kTag, "connect: 连接TCP服务器") //连接监听 val channelFuture = bootstrap.connect(hostname, port) .addListener(object : ChannelFutureListener { @@ -103,6 +103,11 @@ } } + fun disconnect() { + channel?.close()?.addListener(ChannelFutureListener.CLOSE) + Log.d(kTag, "disconnect: 断开TCP服务器") + } + private fun retryConnect() { try { Thread.sleep(timeout) diff --git a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt b/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt deleted file mode 100644 index 6c4d4e4..0000000 --- a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.casic.detector.common.view - -import android.os.Bundle -import com.casic.detector.common.databinding.ActivityConfigRtkServiceBinding -import com.casic.detector.common.utils.LocaleConstant -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.widget.TitleBarView - -class ConfigRTKServiceActivity : KotlinBaseActivity() { - - private val kTag = "ConfigServiceActivity" - - override fun initEvent() { - binding.saveButton.setOnClickListener { - val account = binding.accountView.text.toString().trim() - if (account.isBlank()) { - "请输入差分定位服务账号!".show(this) - return@setOnClickListener - } - - val password = binding.passwordView.text.toString().trim() - if (password.isBlank()) { - "请输入密码!".show(this) - return@setOnClickListener - } - - val ip = binding.serverIpView.text.toString().trim() - if (ip.isBlank()) { - "请输入差分定位服务器IP!".show(this) - return@setOnClickListener - } - - val port = binding.serverPortView.text.toString().trim() - if (port.isBlank()) { - "请输入差分定位服务器端口号!".show(this) - return@setOnClickListener - } - - SaveKeyValues.putValue(LocaleConstant.ACK, account) - SaveKeyValues.putValue(LocaleConstant.ACS, password) - SaveKeyValues.putValue(LocaleConstant.RTK_SERVER, ip) - SaveKeyValues.putValue(LocaleConstant.RTK_PORT, port) - - "差分定位服务器配置成功".show(this) - finish() - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - binding.accountView.setText( - SaveKeyValues.getValue(LocaleConstant.ACK, "") as String - ) - - binding.passwordView.setText( - SaveKeyValues.getValue(LocaleConstant.ACS, "") as String - ) - - binding.serverIpView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_SERVER, "") as String - ) - - binding.serverPortView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_PORT, "") as String - ) - } - - override fun initViewBinding(): ActivityConfigRtkServiceBinding { - return ActivityConfigRtkServiceBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - - } - - override fun onRightClick() { - finish() - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt new file mode 100644 index 0000000..318d05f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RtkLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt index 50b893c..5b483ad 100644 --- a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt +++ b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt @@ -61,15 +61,15 @@ } init { - val eventLoopGroup = NioEventLoopGroup() //设置的连接group + val eventLoopGroup = NioEventLoopGroup() bootstrap = Bootstrap() - bootstrap.group(eventLoopGroup) //设置的一系列连接参数操作等 + bootstrap.group(eventLoopGroup) .channel(NioSocketChannel::class.java) .option(ChannelOption.TCP_NODELAY, true) //无阻塞 .option(ChannelOption.SO_KEEPALIVE, true) //长连接 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) //连接超时时间 .option( - ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 1024, 65536) + ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 2048, 65536) ) .handler(object : ChannelInitializer() { override fun initChannel(socketChannel: SocketChannel) { @@ -85,7 +85,7 @@ fun connect() { synchronized(this) { try { - Log.d(kTag, "connect: 开始连接TCP服务器") + Log.d(kTag, "connect: 连接TCP服务器") //连接监听 val channelFuture = bootstrap.connect(hostname, port) .addListener(object : ChannelFutureListener { @@ -103,6 +103,11 @@ } } + fun disconnect() { + channel?.close()?.addListener(ChannelFutureListener.CLOSE) + Log.d(kTag, "disconnect: 断开TCP服务器") + } + private fun retryConnect() { try { Thread.sleep(timeout) diff --git a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt b/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt deleted file mode 100644 index 6c4d4e4..0000000 --- a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.casic.detector.common.view - -import android.os.Bundle -import com.casic.detector.common.databinding.ActivityConfigRtkServiceBinding -import com.casic.detector.common.utils.LocaleConstant -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.widget.TitleBarView - -class ConfigRTKServiceActivity : KotlinBaseActivity() { - - private val kTag = "ConfigServiceActivity" - - override fun initEvent() { - binding.saveButton.setOnClickListener { - val account = binding.accountView.text.toString().trim() - if (account.isBlank()) { - "请输入差分定位服务账号!".show(this) - return@setOnClickListener - } - - val password = binding.passwordView.text.toString().trim() - if (password.isBlank()) { - "请输入密码!".show(this) - return@setOnClickListener - } - - val ip = binding.serverIpView.text.toString().trim() - if (ip.isBlank()) { - "请输入差分定位服务器IP!".show(this) - return@setOnClickListener - } - - val port = binding.serverPortView.text.toString().trim() - if (port.isBlank()) { - "请输入差分定位服务器端口号!".show(this) - return@setOnClickListener - } - - SaveKeyValues.putValue(LocaleConstant.ACK, account) - SaveKeyValues.putValue(LocaleConstant.ACS, password) - SaveKeyValues.putValue(LocaleConstant.RTK_SERVER, ip) - SaveKeyValues.putValue(LocaleConstant.RTK_PORT, port) - - "差分定位服务器配置成功".show(this) - finish() - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - binding.accountView.setText( - SaveKeyValues.getValue(LocaleConstant.ACK, "") as String - ) - - binding.passwordView.setText( - SaveKeyValues.getValue(LocaleConstant.ACS, "") as String - ) - - binding.serverIpView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_SERVER, "") as String - ) - - binding.serverPortView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_PORT, "") as String - ) - } - - override fun initViewBinding(): ActivityConfigRtkServiceBinding { - return ActivityConfigRtkServiceBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - - } - - override fun onRightClick() { - finish() - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt index 496aaa8..6d8a187 100644 --- a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt @@ -70,8 +70,9 @@ import com.casic.detector.common.utils.GpioManager import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.LocationTool -import com.casic.detector.common.utils.RTKLocationTool +import com.casic.detector.common.utils.NtripAuthorizationCreator import com.casic.detector.common.utils.RouteOnMap +import com.casic.detector.common.utils.RtkLocationTool import com.casic.detector.common.utils.tcp.ConnectState import com.casic.detector.common.utils.tcp.OnSocketConnectListener import com.casic.detector.common.utils.tcp.SocketClient @@ -110,6 +111,7 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import io.netty.buffer.Unpooled import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File @@ -152,10 +154,10 @@ private var gravity: FloatArray? = null private var geomagnetic: FloatArray? = null private var connectState = ConnectState.CLOSED + private var socketClient: SocketClient? = null private lateinit var aMap: AMap private lateinit var sensorManager: SensorManager private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var socketClient: SocketClient /***inner class 需要用到*****start*/ private val gpioManager by lazy { GpioManager() } @@ -186,12 +188,12 @@ //保留小数2位 decimalFormat.roundingMode = RoundingMode.HALF_UP - RTKLocationTool.getCurrentLocation(this) { + RtkLocationTool.getCurrentLocation(this) { if (connectState == ConnectState.SUCCESS) { //连接成功就发送千寻请求报文 val gga = it.convertToGPGGA() Log.d(kTag, gga) - socketClient.sendData(gga) + socketClient?.sendData(gga) } } @@ -322,7 +324,7 @@ 2 -> navigatePageTo() 3 -> uploadEvent() 4 -> completionMarker() - 5 -> navigatePageTo() + 5 -> navigatePageTo() } } }) @@ -1006,15 +1008,28 @@ val magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) sensorManager.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL) + //取缓存 + val remoteHost = SaveKeyValues.getValue( + LocaleConstant.RTK_SERVER, "203.107.45.154" + ) as String + val remotePort = SaveKeyValues.getValue( + LocaleConstant.RTK_PORT, "8003" + ) as String + //连接千寻RTK服务器 lifecycleScope.launch(Dispatchers.IO) { + if (socketClient != null) { + socketClient?.disconnect() + delay(3000) + } + socketClient = SocketClient.Builder() - .setHostname("203.107.45.154") - .setPort(8003) + .setHostname(remoteHost) + .setPort(remotePort.toInt()) .setTimeout(5000) .setOnSocketListener(this@MainActivity) .build() - socketClient.connect() + socketClient?.connect() } } @@ -1025,8 +1040,9 @@ *

* 0d0a0d0a -> \r\n\r\n * */ - val s = String(data, StandardCharsets.UTF_8) - if (s.contains("ICY 200 OK")) { + val result = String(data, StandardCharsets.UTF_8) + Log.d(kTag, "onMessageResponse: $result") + if (result.contains("ICY 200 OK")) { "高精度定位服务器连接成功".show(this) } } else { @@ -1038,30 +1054,27 @@ this.connectState = status if (connectState == ConnectState.SUCCESS) { //连接成功就发送千寻请求报文 - var msg = "GET /RTCM32_GGB HTTP/1.1\r\n" - msg += "Host: ${LocaleConstant.QX_RTK_HOST}\r\n" - msg += "Ntrip-Version: Ntrip/2.0\r\n" - msg += "User-Agent: NTRIP GNSSInternetRadio 2.0.10 \r\n" - msg += "Accept: */*\r\nConnection: close\r\n" - msg += "Accept:*/* \r\n" - // base64加密用户名和密码 - val byteArray = "qxtmcr0087663:1f1f9b9".toByteArray() - val base64 = android.util.Base64.encodeToString(byteArray, android.util.Base64.DEFAULT) - msg += "Authorization: Basic $base64\r\n\r\n" -// val msg = NtripAuthorizationCreator() -// .append("GET /RTCM32_GGB HTTP/1.1") -// .append("Host: ${LocaleConstant.QX_RTK_HOST}") -// .append("Ntrip-Version: Ntrip/2.0") -// .append("User-Agent: NTRIP GNSSInternetRadio 2.0.10") -// .append("Accept: */*") -// .append("Connection: close") -// .append("Accept:*/*") -// .append("Authorization: Basic $base64") -// .toString() + val account = SaveKeyValues.getValue(LocaleConstant.ACK, "qxtmcr0087663") as String + val pwd = SaveKeyValues.getValue(LocaleConstant.ACS, "1f1f9b9") as String + + // base64加密用户名和密码 + val byteArray = "$account:$pwd".toByteArray() + val base64 = android.util.Base64.encodeToString(byteArray, android.util.Base64.DEFAULT) + + val msg = NtripAuthorizationCreator() + .append("GET /RTCM32_GGB HTTP/1.1") + .append("Host: ${LocaleConstant.QX_RTK_HOST}") + .append("Ntrip-Version: Ntrip/2.0") + .append("User-Agent: NTRIP GNSSInternetRadio 2.0.10") + .append("Accept: */*") + .append("Connection: close") + .append("Accept:*/*") + .append("Authorization: Basic $base64") + .toString() val byteBuf = Unpooled.wrappedBuffer(msg.toByteArray()) - socketClient.sendData(byteBuf) + socketClient?.sendData(byteBuf) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt new file mode 100644 index 0000000..318d05f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RtkLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt index 50b893c..5b483ad 100644 --- a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt +++ b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt @@ -61,15 +61,15 @@ } init { - val eventLoopGroup = NioEventLoopGroup() //设置的连接group + val eventLoopGroup = NioEventLoopGroup() bootstrap = Bootstrap() - bootstrap.group(eventLoopGroup) //设置的一系列连接参数操作等 + bootstrap.group(eventLoopGroup) .channel(NioSocketChannel::class.java) .option(ChannelOption.TCP_NODELAY, true) //无阻塞 .option(ChannelOption.SO_KEEPALIVE, true) //长连接 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) //连接超时时间 .option( - ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 1024, 65536) + ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 2048, 65536) ) .handler(object : ChannelInitializer() { override fun initChannel(socketChannel: SocketChannel) { @@ -85,7 +85,7 @@ fun connect() { synchronized(this) { try { - Log.d(kTag, "connect: 开始连接TCP服务器") + Log.d(kTag, "connect: 连接TCP服务器") //连接监听 val channelFuture = bootstrap.connect(hostname, port) .addListener(object : ChannelFutureListener { @@ -103,6 +103,11 @@ } } + fun disconnect() { + channel?.close()?.addListener(ChannelFutureListener.CLOSE) + Log.d(kTag, "disconnect: 断开TCP服务器") + } + private fun retryConnect() { try { Thread.sleep(timeout) diff --git a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt b/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt deleted file mode 100644 index 6c4d4e4..0000000 --- a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.casic.detector.common.view - -import android.os.Bundle -import com.casic.detector.common.databinding.ActivityConfigRtkServiceBinding -import com.casic.detector.common.utils.LocaleConstant -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.widget.TitleBarView - -class ConfigRTKServiceActivity : KotlinBaseActivity() { - - private val kTag = "ConfigServiceActivity" - - override fun initEvent() { - binding.saveButton.setOnClickListener { - val account = binding.accountView.text.toString().trim() - if (account.isBlank()) { - "请输入差分定位服务账号!".show(this) - return@setOnClickListener - } - - val password = binding.passwordView.text.toString().trim() - if (password.isBlank()) { - "请输入密码!".show(this) - return@setOnClickListener - } - - val ip = binding.serverIpView.text.toString().trim() - if (ip.isBlank()) { - "请输入差分定位服务器IP!".show(this) - return@setOnClickListener - } - - val port = binding.serverPortView.text.toString().trim() - if (port.isBlank()) { - "请输入差分定位服务器端口号!".show(this) - return@setOnClickListener - } - - SaveKeyValues.putValue(LocaleConstant.ACK, account) - SaveKeyValues.putValue(LocaleConstant.ACS, password) - SaveKeyValues.putValue(LocaleConstant.RTK_SERVER, ip) - SaveKeyValues.putValue(LocaleConstant.RTK_PORT, port) - - "差分定位服务器配置成功".show(this) - finish() - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - binding.accountView.setText( - SaveKeyValues.getValue(LocaleConstant.ACK, "") as String - ) - - binding.passwordView.setText( - SaveKeyValues.getValue(LocaleConstant.ACS, "") as String - ) - - binding.serverIpView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_SERVER, "") as String - ) - - binding.serverPortView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_PORT, "") as String - ) - } - - override fun initViewBinding(): ActivityConfigRtkServiceBinding { - return ActivityConfigRtkServiceBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - - } - - override fun onRightClick() { - finish() - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt index 496aaa8..6d8a187 100644 --- a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt @@ -70,8 +70,9 @@ import com.casic.detector.common.utils.GpioManager import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.LocationTool -import com.casic.detector.common.utils.RTKLocationTool +import com.casic.detector.common.utils.NtripAuthorizationCreator import com.casic.detector.common.utils.RouteOnMap +import com.casic.detector.common.utils.RtkLocationTool import com.casic.detector.common.utils.tcp.ConnectState import com.casic.detector.common.utils.tcp.OnSocketConnectListener import com.casic.detector.common.utils.tcp.SocketClient @@ -110,6 +111,7 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import io.netty.buffer.Unpooled import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File @@ -152,10 +154,10 @@ private var gravity: FloatArray? = null private var geomagnetic: FloatArray? = null private var connectState = ConnectState.CLOSED + private var socketClient: SocketClient? = null private lateinit var aMap: AMap private lateinit var sensorManager: SensorManager private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var socketClient: SocketClient /***inner class 需要用到*****start*/ private val gpioManager by lazy { GpioManager() } @@ -186,12 +188,12 @@ //保留小数2位 decimalFormat.roundingMode = RoundingMode.HALF_UP - RTKLocationTool.getCurrentLocation(this) { + RtkLocationTool.getCurrentLocation(this) { if (connectState == ConnectState.SUCCESS) { //连接成功就发送千寻请求报文 val gga = it.convertToGPGGA() Log.d(kTag, gga) - socketClient.sendData(gga) + socketClient?.sendData(gga) } } @@ -322,7 +324,7 @@ 2 -> navigatePageTo() 3 -> uploadEvent() 4 -> completionMarker() - 5 -> navigatePageTo() + 5 -> navigatePageTo() } } }) @@ -1006,15 +1008,28 @@ val magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) sensorManager.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL) + //取缓存 + val remoteHost = SaveKeyValues.getValue( + LocaleConstant.RTK_SERVER, "203.107.45.154" + ) as String + val remotePort = SaveKeyValues.getValue( + LocaleConstant.RTK_PORT, "8003" + ) as String + //连接千寻RTK服务器 lifecycleScope.launch(Dispatchers.IO) { + if (socketClient != null) { + socketClient?.disconnect() + delay(3000) + } + socketClient = SocketClient.Builder() - .setHostname("203.107.45.154") - .setPort(8003) + .setHostname(remoteHost) + .setPort(remotePort.toInt()) .setTimeout(5000) .setOnSocketListener(this@MainActivity) .build() - socketClient.connect() + socketClient?.connect() } } @@ -1025,8 +1040,9 @@ *

* 0d0a0d0a -> \r\n\r\n * */ - val s = String(data, StandardCharsets.UTF_8) - if (s.contains("ICY 200 OK")) { + val result = String(data, StandardCharsets.UTF_8) + Log.d(kTag, "onMessageResponse: $result") + if (result.contains("ICY 200 OK")) { "高精度定位服务器连接成功".show(this) } } else { @@ -1038,30 +1054,27 @@ this.connectState = status if (connectState == ConnectState.SUCCESS) { //连接成功就发送千寻请求报文 - var msg = "GET /RTCM32_GGB HTTP/1.1\r\n" - msg += "Host: ${LocaleConstant.QX_RTK_HOST}\r\n" - msg += "Ntrip-Version: Ntrip/2.0\r\n" - msg += "User-Agent: NTRIP GNSSInternetRadio 2.0.10 \r\n" - msg += "Accept: */*\r\nConnection: close\r\n" - msg += "Accept:*/* \r\n" - // base64加密用户名和密码 - val byteArray = "qxtmcr0087663:1f1f9b9".toByteArray() - val base64 = android.util.Base64.encodeToString(byteArray, android.util.Base64.DEFAULT) - msg += "Authorization: Basic $base64\r\n\r\n" -// val msg = NtripAuthorizationCreator() -// .append("GET /RTCM32_GGB HTTP/1.1") -// .append("Host: ${LocaleConstant.QX_RTK_HOST}") -// .append("Ntrip-Version: Ntrip/2.0") -// .append("User-Agent: NTRIP GNSSInternetRadio 2.0.10") -// .append("Accept: */*") -// .append("Connection: close") -// .append("Accept:*/*") -// .append("Authorization: Basic $base64") -// .toString() + val account = SaveKeyValues.getValue(LocaleConstant.ACK, "qxtmcr0087663") as String + val pwd = SaveKeyValues.getValue(LocaleConstant.ACS, "1f1f9b9") as String + + // base64加密用户名和密码 + val byteArray = "$account:$pwd".toByteArray() + val base64 = android.util.Base64.encodeToString(byteArray, android.util.Base64.DEFAULT) + + val msg = NtripAuthorizationCreator() + .append("GET /RTCM32_GGB HTTP/1.1") + .append("Host: ${LocaleConstant.QX_RTK_HOST}") + .append("Ntrip-Version: Ntrip/2.0") + .append("User-Agent: NTRIP GNSSInternetRadio 2.0.10") + .append("Accept: */*") + .append("Connection: close") + .append("Accept:*/*") + .append("Authorization: Basic $base64") + .toString() val byteBuf = Unpooled.wrappedBuffer(msg.toByteArray()) - socketClient.sendData(byteBuf) + socketClient?.sendData(byteBuf) } } diff --git a/app/src/main/java/com/casic/detector/common/view/RtkConfigActivity.kt b/app/src/main/java/com/casic/detector/common/view/RtkConfigActivity.kt new file mode 100644 index 0000000..b51f072 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/view/RtkConfigActivity.kt @@ -0,0 +1,88 @@ +package com.casic.detector.common.view + +import android.os.Bundle +import com.casic.detector.common.databinding.ActivityRtkConfigBinding +import com.casic.detector.common.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.TitleBarView + +class RtkConfigActivity : KotlinBaseActivity() { + + private val kTag = "RtkConfigActivity" + + override fun initEvent() { + binding.saveButton.setOnClickListener { + val account = binding.accountView.text.toString().trim() + if (account.isBlank()) { + "请输入差分定位服务账号!".show(this) + return@setOnClickListener + } + + val password = binding.passwordView.text.toString().trim() + if (password.isBlank()) { + "请输入密码!".show(this) + return@setOnClickListener + } + + val ip = binding.serverIpView.text.toString().trim() + if (ip.isBlank()) { + "请输入差分定位服务器IP!".show(this) + return@setOnClickListener + } + + val port = binding.serverPortView.text.toString().trim() + if (port.isBlank()) { + "请输入差分定位服务器端口号!".show(this) + return@setOnClickListener + } + + SaveKeyValues.putValue(LocaleConstant.ACK, account) + SaveKeyValues.putValue(LocaleConstant.ACS, password) + SaveKeyValues.putValue(LocaleConstant.RTK_SERVER, ip) + SaveKeyValues.putValue(LocaleConstant.RTK_PORT, port) + + "差分定位服务器配置成功".show(this) + finish() + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.accountView.setText( + SaveKeyValues.getValue(LocaleConstant.ACK, "qxtmcr0087663") as String + ) + + binding.passwordView.setText( + SaveKeyValues.getValue(LocaleConstant.ACS, "1f1f9b9") as String + ) + + binding.serverIpView.setText( + SaveKeyValues.getValue(LocaleConstant.RTK_SERVER, "203.107.45.154") as String + ) + + binding.serverPortView.setText( + SaveKeyValues.getValue(LocaleConstant.RTK_PORT, "8003") as String + ) + } + + override fun initViewBinding(): ActivityRtkConfigBinding { + return ActivityRtkConfigBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + + } + + override fun onRightClick() { + finish() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c6710e..89fd3c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,7 +63,7 @@ () ?: return - locationManager.requestLocationUpdates( - LocationManager.GPS_PROVIDER, 0, 0f - ) { - rtkLocationListener.onLocationChanged(it) - } - - LocationManagerCompat.registerGnssStatusCallback( - locationManager, object : GnssStatusCompat.Callback() { - override fun onSatelliteStatusChanged(status: GnssStatusCompat) { - super.onSatelliteStatusChanged(status) - // 可以搜索到的卫星总数 - val satelliteCount = status.satelliteCount - var effectiveCount = 0 - for (index in 0 until satelliteCount) { - /** - * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 - *
- * 参考:https://juejin.cn/post/7144313606329335815 - * */ - val cn0DbHz = status.getCn0DbHz(index) - if (cn0DbHz > 25) { - effectiveCount++ - } - } - SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) - } - }, Handler(Looper.getMainLooper()) - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt new file mode 100644 index 0000000..318d05f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/utils/RtkLocationTool.kt @@ -0,0 +1,62 @@ +package com.casic.detector.common.utils + +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.location.LocationListener +import android.location.LocationManager +import android.os.Handler +import android.os.Looper +import androidx.core.app.ActivityCompat +import androidx.core.location.GnssStatusCompat +import androidx.core.location.LocationManagerCompat +import com.pengxh.kt.lite.extensions.getSystemService +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues + +object RtkLocationTool { + fun getCurrentLocation(context: Context, rtkLocationListener: LocationListener) { + if (ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_FINE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission( + context, Manifest.permission.ACCESS_COARSE_LOCATION + ) != PackageManager.PERMISSION_GRANTED + ) { + "缺少定位权限".show(context) + return + } + val locationManager = context.getSystemService() ?: return + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, 0, 0f + ) { + rtkLocationListener.onLocationChanged(it) + } + + LocationManagerCompat.registerGnssStatusCallback( + locationManager, object : GnssStatusCompat.Callback() { + override fun onSatelliteStatusChanged(status: GnssStatusCompat) { + super.onSatelliteStatusChanged(status) + // 可以搜索到的卫星总数 + val satelliteCount = status.satelliteCount + var effectiveCount = 0 + for (index in 0 until satelliteCount) { + /** + * 每个卫星的载波噪声密度,噪声密度越大,信号越强。 + *
+ * 参考:https://juejin.cn/post/7144313606329335815 + * */ + val cn0DbHz = status.getCn0DbHz(index) + if (cn0DbHz > 25) { + effectiveCount++ + } + } + SaveKeyValues.putValue(LocaleConstant.SATELLITE_EFFECTIVE_COUNT, effectiveCount) + } + }, Handler(Looper.getMainLooper()) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt index 50b893c..5b483ad 100644 --- a/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt +++ b/app/src/main/java/com/casic/detector/common/utils/tcp/SocketClient.kt @@ -61,15 +61,15 @@ } init { - val eventLoopGroup = NioEventLoopGroup() //设置的连接group + val eventLoopGroup = NioEventLoopGroup() bootstrap = Bootstrap() - bootstrap.group(eventLoopGroup) //设置的一系列连接参数操作等 + bootstrap.group(eventLoopGroup) .channel(NioSocketChannel::class.java) .option(ChannelOption.TCP_NODELAY, true) //无阻塞 .option(ChannelOption.SO_KEEPALIVE, true) //长连接 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 * 1000) //连接超时时间 .option( - ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 1024, 65536) + ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator(64, 2048, 65536) ) .handler(object : ChannelInitializer() { override fun initChannel(socketChannel: SocketChannel) { @@ -85,7 +85,7 @@ fun connect() { synchronized(this) { try { - Log.d(kTag, "connect: 开始连接TCP服务器") + Log.d(kTag, "connect: 连接TCP服务器") //连接监听 val channelFuture = bootstrap.connect(hostname, port) .addListener(object : ChannelFutureListener { @@ -103,6 +103,11 @@ } } + fun disconnect() { + channel?.close()?.addListener(ChannelFutureListener.CLOSE) + Log.d(kTag, "disconnect: 断开TCP服务器") + } + private fun retryConnect() { try { Thread.sleep(timeout) diff --git a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt b/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt deleted file mode 100644 index 6c4d4e4..0000000 --- a/app/src/main/java/com/casic/detector/common/view/ConfigRTKServiceActivity.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.casic.detector.common.view - -import android.os.Bundle -import com.casic.detector.common.databinding.ActivityConfigRtkServiceBinding -import com.casic.detector.common.utils.LocaleConstant -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.SaveKeyValues -import com.pengxh.kt.lite.widget.TitleBarView - -class ConfigRTKServiceActivity : KotlinBaseActivity() { - - private val kTag = "ConfigServiceActivity" - - override fun initEvent() { - binding.saveButton.setOnClickListener { - val account = binding.accountView.text.toString().trim() - if (account.isBlank()) { - "请输入差分定位服务账号!".show(this) - return@setOnClickListener - } - - val password = binding.passwordView.text.toString().trim() - if (password.isBlank()) { - "请输入密码!".show(this) - return@setOnClickListener - } - - val ip = binding.serverIpView.text.toString().trim() - if (ip.isBlank()) { - "请输入差分定位服务器IP!".show(this) - return@setOnClickListener - } - - val port = binding.serverPortView.text.toString().trim() - if (port.isBlank()) { - "请输入差分定位服务器端口号!".show(this) - return@setOnClickListener - } - - SaveKeyValues.putValue(LocaleConstant.ACK, account) - SaveKeyValues.putValue(LocaleConstant.ACS, password) - SaveKeyValues.putValue(LocaleConstant.RTK_SERVER, ip) - SaveKeyValues.putValue(LocaleConstant.RTK_PORT, port) - - "差分定位服务器配置成功".show(this) - finish() - } - } - - override fun initOnCreate(savedInstanceState: Bundle?) { - binding.accountView.setText( - SaveKeyValues.getValue(LocaleConstant.ACK, "") as String - ) - - binding.passwordView.setText( - SaveKeyValues.getValue(LocaleConstant.ACS, "") as String - ) - - binding.serverIpView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_SERVER, "") as String - ) - - binding.serverPortView.setText( - SaveKeyValues.getValue(LocaleConstant.RTK_PORT, "") as String - ) - } - - override fun initViewBinding(): ActivityConfigRtkServiceBinding { - return ActivityConfigRtkServiceBinding.inflate(layoutInflater) - } - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { - override fun onLeftClick() { - - } - - override fun onRightClick() { - finish() - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt index 496aaa8..6d8a187 100644 --- a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt @@ -70,8 +70,9 @@ import com.casic.detector.common.utils.GpioManager import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.LocationTool -import com.casic.detector.common.utils.RTKLocationTool +import com.casic.detector.common.utils.NtripAuthorizationCreator import com.casic.detector.common.utils.RouteOnMap +import com.casic.detector.common.utils.RtkLocationTool import com.casic.detector.common.utils.tcp.ConnectState import com.casic.detector.common.utils.tcp.OnSocketConnectListener import com.casic.detector.common.utils.tcp.SocketClient @@ -110,6 +111,7 @@ import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import io.netty.buffer.Unpooled import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File @@ -152,10 +154,10 @@ private var gravity: FloatArray? = null private var geomagnetic: FloatArray? = null private var connectState = ConnectState.CLOSED + private var socketClient: SocketClient? = null private lateinit var aMap: AMap private lateinit var sensorManager: SensorManager private lateinit var weakReferenceHandler: WeakReferenceHandler - private lateinit var socketClient: SocketClient /***inner class 需要用到*****start*/ private val gpioManager by lazy { GpioManager() } @@ -186,12 +188,12 @@ //保留小数2位 decimalFormat.roundingMode = RoundingMode.HALF_UP - RTKLocationTool.getCurrentLocation(this) { + RtkLocationTool.getCurrentLocation(this) { if (connectState == ConnectState.SUCCESS) { //连接成功就发送千寻请求报文 val gga = it.convertToGPGGA() Log.d(kTag, gga) - socketClient.sendData(gga) + socketClient?.sendData(gga) } } @@ -322,7 +324,7 @@ 2 -> navigatePageTo() 3 -> uploadEvent() 4 -> completionMarker() - 5 -> navigatePageTo() + 5 -> navigatePageTo() } } }) @@ -1006,15 +1008,28 @@ val magnetic = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) sensorManager.registerListener(this, magnetic, SensorManager.SENSOR_DELAY_NORMAL) + //取缓存 + val remoteHost = SaveKeyValues.getValue( + LocaleConstant.RTK_SERVER, "203.107.45.154" + ) as String + val remotePort = SaveKeyValues.getValue( + LocaleConstant.RTK_PORT, "8003" + ) as String + //连接千寻RTK服务器 lifecycleScope.launch(Dispatchers.IO) { + if (socketClient != null) { + socketClient?.disconnect() + delay(3000) + } + socketClient = SocketClient.Builder() - .setHostname("203.107.45.154") - .setPort(8003) + .setHostname(remoteHost) + .setPort(remotePort.toInt()) .setTimeout(5000) .setOnSocketListener(this@MainActivity) .build() - socketClient.connect() + socketClient?.connect() } } @@ -1025,8 +1040,9 @@ *

* 0d0a0d0a -> \r\n\r\n * */ - val s = String(data, StandardCharsets.UTF_8) - if (s.contains("ICY 200 OK")) { + val result = String(data, StandardCharsets.UTF_8) + Log.d(kTag, "onMessageResponse: $result") + if (result.contains("ICY 200 OK")) { "高精度定位服务器连接成功".show(this) } } else { @@ -1038,30 +1054,27 @@ this.connectState = status if (connectState == ConnectState.SUCCESS) { //连接成功就发送千寻请求报文 - var msg = "GET /RTCM32_GGB HTTP/1.1\r\n" - msg += "Host: ${LocaleConstant.QX_RTK_HOST}\r\n" - msg += "Ntrip-Version: Ntrip/2.0\r\n" - msg += "User-Agent: NTRIP GNSSInternetRadio 2.0.10 \r\n" - msg += "Accept: */*\r\nConnection: close\r\n" - msg += "Accept:*/* \r\n" - // base64加密用户名和密码 - val byteArray = "qxtmcr0087663:1f1f9b9".toByteArray() - val base64 = android.util.Base64.encodeToString(byteArray, android.util.Base64.DEFAULT) - msg += "Authorization: Basic $base64\r\n\r\n" -// val msg = NtripAuthorizationCreator() -// .append("GET /RTCM32_GGB HTTP/1.1") -// .append("Host: ${LocaleConstant.QX_RTK_HOST}") -// .append("Ntrip-Version: Ntrip/2.0") -// .append("User-Agent: NTRIP GNSSInternetRadio 2.0.10") -// .append("Accept: */*") -// .append("Connection: close") -// .append("Accept:*/*") -// .append("Authorization: Basic $base64") -// .toString() + val account = SaveKeyValues.getValue(LocaleConstant.ACK, "qxtmcr0087663") as String + val pwd = SaveKeyValues.getValue(LocaleConstant.ACS, "1f1f9b9") as String + + // base64加密用户名和密码 + val byteArray = "$account:$pwd".toByteArray() + val base64 = android.util.Base64.encodeToString(byteArray, android.util.Base64.DEFAULT) + + val msg = NtripAuthorizationCreator() + .append("GET /RTCM32_GGB HTTP/1.1") + .append("Host: ${LocaleConstant.QX_RTK_HOST}") + .append("Ntrip-Version: Ntrip/2.0") + .append("User-Agent: NTRIP GNSSInternetRadio 2.0.10") + .append("Accept: */*") + .append("Connection: close") + .append("Accept:*/*") + .append("Authorization: Basic $base64") + .toString() val byteBuf = Unpooled.wrappedBuffer(msg.toByteArray()) - socketClient.sendData(byteBuf) + socketClient?.sendData(byteBuf) } } diff --git a/app/src/main/java/com/casic/detector/common/view/RtkConfigActivity.kt b/app/src/main/java/com/casic/detector/common/view/RtkConfigActivity.kt new file mode 100644 index 0000000..b51f072 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/view/RtkConfigActivity.kt @@ -0,0 +1,88 @@ +package com.casic.detector.common.view + +import android.os.Bundle +import com.casic.detector.common.databinding.ActivityRtkConfigBinding +import com.casic.detector.common.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.TitleBarView + +class RtkConfigActivity : KotlinBaseActivity() { + + private val kTag = "RtkConfigActivity" + + override fun initEvent() { + binding.saveButton.setOnClickListener { + val account = binding.accountView.text.toString().trim() + if (account.isBlank()) { + "请输入差分定位服务账号!".show(this) + return@setOnClickListener + } + + val password = binding.passwordView.text.toString().trim() + if (password.isBlank()) { + "请输入密码!".show(this) + return@setOnClickListener + } + + val ip = binding.serverIpView.text.toString().trim() + if (ip.isBlank()) { + "请输入差分定位服务器IP!".show(this) + return@setOnClickListener + } + + val port = binding.serverPortView.text.toString().trim() + if (port.isBlank()) { + "请输入差分定位服务器端口号!".show(this) + return@setOnClickListener + } + + SaveKeyValues.putValue(LocaleConstant.ACK, account) + SaveKeyValues.putValue(LocaleConstant.ACS, password) + SaveKeyValues.putValue(LocaleConstant.RTK_SERVER, ip) + SaveKeyValues.putValue(LocaleConstant.RTK_PORT, port) + + "差分定位服务器配置成功".show(this) + finish() + } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.accountView.setText( + SaveKeyValues.getValue(LocaleConstant.ACK, "qxtmcr0087663") as String + ) + + binding.passwordView.setText( + SaveKeyValues.getValue(LocaleConstant.ACS, "1f1f9b9") as String + ) + + binding.serverIpView.setText( + SaveKeyValues.getValue(LocaleConstant.RTK_SERVER, "203.107.45.154") as String + ) + + binding.serverPortView.setText( + SaveKeyValues.getValue(LocaleConstant.RTK_PORT, "8003") as String + ) + } + + override fun initViewBinding(): ActivityRtkConfigBinding { + return ActivityRtkConfigBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + + } + + override fun onRightClick() { + finish() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_config_rtk_service.xml b/app/src/main/res/layout/activity_config_rtk_service.xml deleted file mode 100644 index b6dab48..0000000 --- a/app/src/main/res/layout/activity_config_rtk_service.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -